2009-02-27 12 views
2

J'espère utilisé le terme droitDéfinir RunWorkerCompleted du concepteur de fond avec une méthode anonyme?

Ce que je vise est quelque chose comme ça (je me rends compte qu'il ne fonctionne pas de cette façon):

private bool someBool = false; 

BackgroundWorker bg = new BackgroundWorker(); 
bg.DoWork += new DoWorkEventHandler(DoLengthyTask); 
bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
    ()=> 
     { 
      someBool = true; 
      Logger.Info("Finished"); 
     } 
) 

L'important étant le RunWorkerCompletedEventHandler étant défini dans la portée de l'appelant d'origine et par celui ayant accès aux variables de l'appelant.

Est-ce possible? Cela générerait-il des conditions de course possibles sur le someBool?

+0

Que l'autre utilisateur accède bool? Ceci est essentiel pour comprendre les conditions de course possibles ... –

+0

Les choses dans le fil principal auront accès au bool. Dans cet exemple (fictif), il se peut qu'une certaine ligne de l'enregistreur puisse être ajoutée plus tard. –

Répondre

3

Il ne fonctionne pas dans votre exemple, puisque le délégué complet devrait recevoir 2 paramètres:

private bool someBool = false; 

BackgroundWorker bg = new BackgroundWorker(); 
bg.DoWork += new DoWorkEventHandler(DoLengthyTask); 
bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
     (sender, e)=> 
       { 
         someBool = true; 
         Logger.Info("Finished"); 
       } 
) 
+0

Bien que ce soit vrai, je ne suis pas sûr que cela puisse vous aider à répondre à la question réelle ... –

+0

Maintenant, seul le problème des conditions de course subsiste. –

0

Tout dépend de ce que l'autre utilise bool.

En particulier, le bool est-il vraiment un champ (comme suggéré par le "privé"), ou est-ce une variable? Il y a une différence, car vous pouvez marquer un champ comme volatile (mais pas une variable).

Cependant, mon intuition est que vous devriez utiliser la synchronisation comme Monitor, peut-être avec des pulsations etc - ou une porte comme ManualResetEvent.

Sans soit la synchronisation ou volatile, it is possible pour un autre thread pour ne pas voir les changements à la variable - mais nous ne pouvons vraiment pas dire plus sans l'autre moitié du code ...

+0

Je crains qu'il n'y ait pas d'autre moitié. C'était un exemple fictif dans un effort pour casser un plus gros problème que je ne peux pas résoudre en plus petits sous-problèmes. Pour l'ensemble de la photo, veuillez vous référer à http://stackoverflow.com/questions/594230/wait-for-two-threads-to-finish/594238#594238 –

Questions connexes