2009-02-27 10 views
2

Ich hoffe, dass ich den richtigen BegriffDefinieren Sie RunWorkerCompleted des Hintergrundarbeiters mit einer anonymen Methode?

verwendet

Was denn ich bin mit dem Ziel ist so etwas wie diese (Ich weiß es nicht so funktioniert):

private bool someBool = false; 

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

Der wichtige Teil den RunWorkerCompletedEventHandler ist definiert wird im Rahmen des ursprünglichen Aufrufers und damit Zugriff auf die Variablen des Aufrufers.

Ist das möglich? Würde es mögliche Rennen auf dem someBool generieren?

+0

Was die Bool greift? Dies ist wichtig, um mögliche Rennbedingungen zu verstehen ... –

+0

Die Dinge im Hauptthread werden auf den bool zugreifen. In diesem (fiktiven) Beispiel könnte es sein, dass eine bestimmte Zeile im Logger später hinzugefügt werden könnte. –

Antwort

3

funktioniert es nicht in Ihrem Beispiel, da der komplette Delegat 2 Parameter erhalten soll:

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

Auch wenn das stimmt, bin ich mir nicht sicher, ob das wirklich zur Beantwortung der Frage (n) führt ... –

+0

Jetzt bleibt nur noch das Problem der Rennbedingungen. –

0

Es auf alles hängt, was sonst noch verwendet den Bool.

Insbesondere ist es der Bool wirklich ein Feld (wie von der "privaten" vorgeschlagen), oder ist es eine Variable? Es gibt einen Unterschied, wie Sie ein Feld als volatile (aber keine Variable) markieren können.

Aber mein Bauchgefühl ist, dass Sie Synchronisation wie Monitor verwenden sollten, vielleicht mit pulsierenden etc - oder ein Tor wie ManualResetEvent.

Ohne entweder Synchronisation oder volatile, it is possible für einen anderen Thread zu keine Änderungen an der Variablen zu sehen - aber wir können wirklich nicht mehr sagen, ohne die andere Hälfte des Codes ...

+0

Ich fürchte, es gibt keine andere Hälfte. Es war ein fiktives Beispiel dafür, ein größeres Problem zu lösen, das ich nicht lösen kann, in kleinere Teilprobleme. Für das gesamte Bild, siehe http://StackOverflow.com/Questions/594230/wait-for-two-Threads-to-finish/594238#594238 –

Verwandte Themen