WaitAll pour plusieurs poignées sur un thread STA n'est pas pris en charge
- Pourquoi j'obtiens ce message d'erreur? "WaitAll pour plusieurs poignées sur un thread STA n'est pas pris en charge".
- Dois-je utiliser [MTAThreadAttribute] attribut? Mise à jour: Dosn fonctionne pas avec les applications WPF!
Note:
C'erreur est à la ligne WaitHandle.WaitAll(doneEvents);
Je suis en utilisant un standard projet WPF.
private void Search()
{
const int CPUs = 2;
var doneEvents = new ManualResetEvent[CPUs];
//Configure and launch threads using ThreadPool:
for (int i = 0; i < CPUs; i++)
{
doneEvents[i] = new ManualResetEvent(false);
var f = new Indexer(Paths[i], doneEvents[i]);
ThreadPool.QueueUserWorkItem(f.WaitCallBack, i);
}
//Wait for all threads in pool
WaitHandle.WaitAll(doneEvents);
Debug.WriteLine("Search completed!");
}
Mise à jour: La solution suivante ne fonctionne pas pour les applications WPF!
Il n'est pas possible de changer l'application principale de l'attribut MTAThreadAttribute. Il en résultera l'erreur suivante:
Erreur: "WaitAll pour plusieurs poignées sur un thread STA n'est pas pris en charge."
- Vous vous rendez compte que votre application va geler complètement jusqu'à ce que les Indexeurs sont-ils faits?
- Oui! Je sais qu'. Mais comme il est il ne fonctionne pas.
- stackoverflow.com/questions/3784510/...
- La même erreur, mais la solution n'est pas pour les applications WPF! Vous ne pouvez pas modifier principal attribut de la méthode pour l'application WPF.
Vous devez vous connecter pour publier un commentaire.
Qu'en utilisant les Tâches à accomplir votre threading pour vous.
http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx
Task.Run(()=>DoSomeWork())
est une meilleure alternativeEn fait j'utilise la suite pour remplacer WaitHandle.WaitAll(doneEvents);
Utiliser un
ManualResetEvent
et d'attendre sur elle. Également maintenir un TaskCount variable qui est définie pour le nombre de threads de travail de commencer, vous devez utiliserInterlocked.Decrement
dans le thread de code de la dernière action du travailleur et le signal de l'événement, si le compteur atteint zéro,par exempletaskCount = 1
et de faire leDecrement
etSet
à la fin de lafor
boucle.Je refactoriser votre code pour utiliser la
CountdownEvent
classe à la place.WaitHandle.WaitAll(multipleEvents);
!utiliser quelque chose comme ceci: