我最近重写了我的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的源代码,但在此之前,我想我会在这里查看帮助。
问候迈克尔
答案 0 :(得分:1)
添加
WindowsFormsSynchronizationContext.AutoInstall = false;
在Test_B()之前的其他任何事情。 BackgroundWorker,它是非常UI(即:Winforms)导向,是疯狂猜测如何同步事物,但不是你想要的。看看这里有一些解释(特别是来自Scott Berry):WindowsFormsSynchronizationContext