System.ComponentModel.BackgroundWorker从不调用ProgressChanged

时间:2010-12-02 08:12:51

标签: winforms backgroundworker

我最近重写了我的Windows窗体应用程序以使用BackgroundWorker实例而不是使用手动创建的“工作线程”。签入后我注意到一些测试开始失败。经过一些调试后,我可以通过向您展示以下2个测试来证明我的问题:

    [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_B在Test_B失败时成功。如果我睡100毫秒或100分钟,这就无论如何。为什么??我的生产代码似乎工作,但令人讨厌的是无法使回归测试套件工作(我有其他测试创建Forms组件,这些测试必须在我使用BackgroundWorker测试之前执行) 下一步是检查BackgroundWorker的源代码,但在此之前,我想我会在这里查看帮助。

问候迈克尔

1 个答案:

答案 0 :(得分:1)

添加

WindowsFormsSynchronizationContext.AutoInstall = false;

在Test_B()之前的其他任何事情。 BackgroundWorker,它是非常UI(即:Winforms)导向,是疯狂猜测如何同步事物,但不是你想要的。看看这里有一些解释(特别是来自Scott Berry):WindowsFormsSynchronizationContext