2010-12-02 10 views
0

最近、手動で作成した「ワーカースレッド」を使用する代わりに、BackgroundWorkerインスタンスを使用するようにWindowsフォームアプリケーションを書き直しました。チェックイン後、私はいくつかのテストが失敗し始めたことに気付きました。いくつかのデバッグの後、私はあなたに次の2つのテストを示すことで私の問題を実証することができます: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が成功しませんTest_Bが失敗します。これは、100 msまたは100分眠っても関係ありません。なぜ??私の生産コードはうまくいくようですが、回帰テストスイートを使用できないのは面倒です(私はFormsコンポーネントを作成するテストがあり、BackgroundWorkerを使ってテストを実行する必要があります) 次のステップは、 BackgroundWorkerのソースコードを調べてください。しかし、私がそれを行う前に、私はここでヘルプのチェックをしていたと思いました。

答えて

1

よろしくマイケルは何かの前にTEST_B()で

WindowsFormsSynchronizationContext.AutoInstall = false; 

を追加します。 BackgroundWorkerはUI(つまり:WinForms)を指向しているので、物事を同期させる方法は荒く推測されますが、好きなようにはなりません。ここでいくつかの説明をご覧ください(特にスコットベリーから):WindowsFormsSynchronizationContext

+0

ありがとう、すぐに働きました! – Michael

+0

これを答えとしてマークすることができます:) –

関連する問題