2010-03-18 1 views
2

J'ai une "liste" dans l'application principale et j'essaye d'accéder à ses éléments à partir d'un fil. Je reçois cette exception: { «Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread est le propriétaire »} {System.SystemException System.InvalidOperationException}élément de liste d'accès à partir du fil

Répondre

2
DispatcherOperation d = myListBox.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => 
{ 
    // access your listbox and return something 
})); 

Ensuite, votre DispatcherOperation exigent la valeur de retour

myValue = d.Result; //Result is of type Object 
+0

Merci pour la solution. Ma liste est une liste et l'application se fige lorsque j'essaie d'obtenir le n-ème élément en utilisant votre méthode. – phm

+0

Dans ce cas, copiez le répartiteur de l'interface utilisateur comme ceci. Dispatcher UIdispatcher = Dispatcher.CurrentDispatcher; avant de commencer votre discussion. Maintenant dans votre thread au lieu de myListBox.Dispatcher utilisez UIdispatcher.Invoke (...) Pouvez-vous me dire comment vous avez appelé la méthode Invoke. Je veux dire votre code. – Amsakanna

+0

Utilisez Invoke et non BeginInvoke. jette le résultat dans le type désiré – Amsakanna

1

Vous pouvez utiliser un fil croix en déclarant un délégué. Puis créez une méthode et mettez toutes les méthodes qui accèdent à votre liste.

private void SampleMethod() 
{ 
.... 
} 

puis de créer une méthode pour votre thread. Dans cette méthode invoquez votre méthode whick

private void ThreadMethod() 
{ 

      thread_delegate d = new thread_delegate(SampleMethod); 
      d.Invoke(); 
} 

Sur votre déclaration où vous créez votre fil ...

Thread t = new Thread(new ThreadStart(ThreadMethod));  
t.Start(); 
+0

J'ai déjà essayé cette approche, et cela ne fonctionne pas. Je reçois la même exception – phm

0

Essayez ceci.
MaListbox est un ListBox

namespace TEST 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      Thread th = new Thread(AccessList); 
      th.Start(MylistBox); 
     } 

     void AccessList(Object O) 
     { 
      ListBox lBox = O as ListBox; 
      for (int i = 0; i < lBox.Items.Count; i++) 
      { 
       MessageBox.Show(lBox.Items[i].ToString()); 
      } 
     } 
    } 
} 
Questions connexes