[C#/WPF] Problème de threads

Signaler
Messages postés
32
Date d'inscription
vendredi 6 août 2010
Statut
Membre
Dernière intervention
17 avril 2012
-
Messages postés
11
Date d'inscription
jeudi 29 novembre 2007
Statut
Membre
Dernière intervention
24 mai 2012
-
Bonjour à tous,

Je viens vers vous avec un petit problème de threads. Voici mon erreur :
Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire.

Pour faire simple, j'ai une MainWindow avec une ListBox que je veux mofidier à partir d'une autre classe sous le même projet.
J'utilise donc un thread qui appelle une méthode qui modifie la listBox. Cependant j'obtiens l'erreur dont je viens de parler
Voilà mon code :


System.Threading.Thread thread = new System.Threading.Thread(
new System.Threading.ThreadStart(
delegate()
{
MainWindow wind = App.Current.MainWindow as MainWindow;
wind.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Normal,
new Action(
delegate()
{

wind.RemplirListBox(ss);
}
));
}
));

thread.Start();].

Voilà j'espère que j'ai été clair !
A voir également:

4 réponses

Messages postés
32
Date d'inscription
vendredi 6 août 2010
Statut
Membre
Dernière intervention
17 avril 2012
3
salut,
en fait ce n'est pas suffisant, la solution dont j'ai trouvé consiste à
App.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
{
MainWindow wind = App.Current.MainWindow as MainWindow;

wind.listBox1.Items.Add(m.ToString());
}, null);
il faut évoquer le thread courant de l'application non pas celui créer pour la mise à jour de la listebox, le dispatcher va servir au nouveau thread d’accéder à un objet qui est en cours d'utilisation par l'autre thread qui est bien entendu le thread principal c'est pour cela il faut faire App.current
Voilà.
Messages postés
11
Date d'inscription
jeudi 29 novembre 2007
Statut
Membre
Dernière intervention
24 mai 2012
3
Est-ce que ce traitement n'est pas suffissant ?

MainWindow wind = App.Current.MainWindow as MainWindow;
wind.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.ApplicationIdle, new Action(() => wind.RemplirListBox(ss)));
Messages postés
11
Date d'inscription
jeudi 29 novembre 2007
Statut
Membre
Dernière intervention
24 mai 2012
3
Salut,lance le BeginInvoke à la place du Invoke

System.Threading.Thread thread = new System.Threading.Thread(
new System.Threading.ThreadStart(
delegate()
{
MainWindow wind = App.Current.MainWindow as MainWindow;
wind.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(() => wind.RemplirListBox(ss)));
));
Messages postés
11
Date d'inscription
jeudi 29 novembre 2007
Statut
Membre
Dernière intervention
24 mai 2012
3
Content que ton problème soit réglé, en tout cas tu viens de me faire découvrir le SendOrPostCallback que je ne connaissais pas