[C#/WPF] Problème de threads

Messages postés
32
Date d'inscription
vendredi 6 août 2010
Statut
Membre
Dernière intervention
17 avril 2012
- - Dernière réponse : SCapeFrom
Messages postés
11
Date d'inscription
jeudi 29 novembre 2007
Statut
Membre
Dernière intervention
24 mai 2012
- 17 avril 2012 à 16:12
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 !
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
32
Date d'inscription
vendredi 6 août 2010
Statut
Membre
Dernière intervention
17 avril 2012
1
1
Merci
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à.

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de omar235689
Messages postés
11
Date d'inscription
jeudi 29 novembre 2007
Statut
Membre
Dernière intervention
24 mai 2012
0
Merci
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)));
));
Commenter la réponse de SCapeFrom
Messages postés
11
Date d'inscription
jeudi 29 novembre 2007
Statut
Membre
Dernière intervention
24 mai 2012
0
Merci
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)));
Commenter la réponse de SCapeFrom
Messages postés
11
Date d'inscription
jeudi 29 novembre 2007
Statut
Membre
Dernière intervention
24 mai 2012
0
Merci
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
Commenter la réponse de SCapeFrom