2009-02-27 65 views
2

我希望我用正確的術語使用匿名方法定義backgroundworker的RunWorkerCompleted?

什麼我的目標是這樣的(我知道它不工作的方式):

private bool someBool = false; 

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

作爲RunWorkerCompletedEventHandler的重要組成部分,被定義在原始調用者的範圍內並且可以訪問調用者的變量。

這可能嗎?它會在someBool上產生可能的競爭條件嗎?

+0

還有什麼訪問布爾?這對了解可能的競賽條件至關重要...... – 2009-02-27 11:13:38

+0

主線程中的事物將訪問布爾值。 在這個(虛構的)例子中,記錄器中的某一行可能會在稍後添加。 – 2009-02-27 12:35:44

回答

3

它不會在你的榜樣工作,因爲完整的代表應接受2個參數:

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

雖然確實如此,但我不確定是否有任何方法可以回答實際問題... – 2009-02-27 11:18:03

0

這一切都取決於什麼別的使用布爾。

特別是,它真的是一個字段(如「私人」所建議的),還是它是一個變量?有一個區別,因爲您可以將字段標記爲volatile(但不是變量)。

但是,我的直覺是,你應該使用同步,如Monitor,也許與脈衝等 - 或門,如ManualResetEvent

沒有任何同步或volatileit is possible另一個線程看不到改變的變量 - 但我們真的不能說沒有更多的代碼的另一半......

相關問題