2010-12-02 62 views
0

我最近重寫了Windows窗體應用程序以使用BackgroundWorker實例,而不是使用手動創建的「工作線程」。簽入後,我注意到一些測試開始失敗。而Test_B失敗System.ComponentModel.BackgroundWorker永遠不會調用ProgressChanged

[Test]   
    public void Test_A() 
    { 
     bool progressChanged = false; 
     var worker = new BackgroundWorker(); 
     worker.WorkerReportsProgress = true; 
     worker.DoWork += (s, e) => worker.ReportProgress(0, null); 
     worker.ProgressChanged += (s, e) => progressChanged = true; 
     worker.RunWorkerAsync(); 
     Thread.Sleep(100); 
     progressChanged.ShouldBeTrue();    
    } 

    [Test]   
    public void Test_B() 
    { 
     //Creation of o form component causes (?) this test to fail, even do I dispose it 
     var view = new Form(); 
     view.Dispose(); 

     bool progressChanged = false; 
     var worker = new BackgroundWorker(); 
     worker.WorkerReportsProgress = true; 
     worker.DoWork += (s, e) => worker.ReportProgress(0, null); 
     worker.ProgressChanged += (s, e) => progressChanged = true; 
     worker.RunWorkerAsync(); 
     Thread.Sleep(100); 
     progressChanged.ShouldBeTrue();    
    } 

Test_A成功:一些調試後,我可以向您展示以下2個測試demonstate我的問題。無論我睡了100毫秒還是100分鐘,這都是無關的。爲什麼??我的生產代碼似乎工作,但它是令人討厭的不能夠有一個迴歸測試套件的工作(我有其他測試創建窗體組件,這些測試必須執行之前,我的測試使用BackgroundWorker) 下一步將是檢查BackgroundWorker的源代碼,但在我這樣做之前,我想我會在這裏尋求幫助。

問候邁克爾

回答

1

任何事情之前添加

WindowsFormsSynchronizationContext.AutoInstall = false; 

在Test_B()。 BackgroundWorker,這非常UI(即:Winforms)爲導向,是野生猜測如何同步的東西,但不是你想要的。看看這裏的一些解釋(特別是從斯科特漿果):WindowsFormsSynchronizationContext

+0

非常感謝,立即工作! – Michael 2010-12-02 08:37:25

相關問題