Pourquoi BackgroundWorker est toujours occupé?
J'ai réalisé quelque chose d'étrange dans mon fond travailleur dans mon application WPF.
Ce que je suis en train d'accomplir est d'attendre jusqu'à ce que le BW finitions pour démarrer un autre thread.
Vérifier le code suivant:
if (bw.IsBusy)
{
bw.CancelAsync();
System.Threading.ThreadStart WaitThread =
new System.Threading.ThreadStart(delegate() {
while (bw.IsBusy)
{
System.Threading.Thread.Sleep(100);
}
bw.RunWorkerAsync();
});
System.Windows.Application.Current.Dispatcher.Invoke(
System.Windows.Threading.DispatcherPriority.Normal,
WaitThread); //if I remove this line, bw fires RunWorkerAsyncEvent
}
else
{
bw.RunWorkerAsync();
}
Veuillez noter que j'ai ajouté un Répartiteur.Invoquer attendre jusqu'à ce que le bw est pas occupé, mais TOUT LE TEMPS EST OCCUPÉE si j'Invoque et ne jamais les feux de la RunWorkerAsyncCompleted
événement. Bien que, si je supprime cette ligne, les FEUX de l'événement et c'est vraiment étrange.
Comment puis-je attendre jusqu'à ce que le bw finitions?
Il n'est pas clair, ce ligne vous retirer, et quels changements puis...pourriez-vous l'expliquer avec plus de soin?
OriginalL'auteur Darf Zon | 2013-01-21
Vous devez vous connecter pour publier un commentaire.
Ce qui est appelé "l'impasse", un très commun de filetage problème. Le BGW ne peut pas arrêter d'être occupés jusqu'à ce que le RunWorkerCompleted événement s'exécute. Cet événement s'exécute sur votre application thread principal, il ne peut s'exécuter lorsque votre thread principal n'est pas occupé à faire autre chose. Il a d'être inactif, fonctionnant à l'intérieur du répartiteur de la boucle.
Mais votre thread principal n'est pas inactif, il est coincé à l'intérieur de la boucle while() attend IsBusy de fausse déclaration. Si l'événement ne peut jamais être exécuté depuis le thread principal est occupé attente pour le BGW pour terminer, le BGW ne peut pas complète parce que le thread principal ne va jamais inactif. "Étreinte mortelle", aka impasse.
Vous aurez à faire les choses différemment, vous ne pouvez pas attendre. Dire par la création d'une autre instance de BGW. Ou tout simplement pas permettre à ce code à courir jusqu'à la RWC événement se déclenche. Ou par la fixation d'un drapeau, testés par le gestionnaire d'événements RunWorkerCompleted qui peut ensuite démarrer le BGW de nouveau.
Une autre solution sale: Si la boucle d'attente est en MainThread: Appel " de l'Application.DoEvents();" dans la boucle. Cela permettra également de résoudre l'Impasse.
OriginalL'auteur Hans Passant
Le blocage se produit en raison de la "main" au fil de l'application ne peut pas fonctionner (et de gérer les événements), donc le Backgroundworker est jamais en mesure de l'incendie qu'il a fini de fonction. Ce que vous pouvez faire pour permettre à l'application de feu c'est ajouter une Application.DoEvents();
C'est ce que j'utilise actuellement dans un scénario similaire, et il semble fonctionner comme un charme!
OriginalL'auteur Gnutt
Je ne suis pas sûr si j'ai bien compris, mais je pense que vous êtes sont en train de redémarrer le BackgroundWorker (si elle est occupée, vous pouvez l'arrêter en premier et ensuite vous commencez à nouveau), si c'est ce que vous voulez, essayez cette:
déclarer cette délégué quelque part dans votre classe:
et utiliser ce code pour redémarrer votre BackgroundWorker:
OriginalL'auteur someone else
Ici est plein et le code de travail.
C# (de la classe de fenêtre)
XAML
OriginalL'auteur Academy of Programmer