Ras*_*ber 2 .net c# multithreading unit-testing backgroundworker
使用NUnit控制台运行程序运行时,此测试失败.如果我使用TestDriven.NET运行该测试,它会起作用,但如果我使用TestDriven.NET运行整个套件则不行:
[Test]
public void BackgroundWorkerFiresRunWorkerCompleted()
{
var runner = new BackgroundWorker();
ManualResetEvent done = new ManualResetEvent(false);
runner.RunWorkerCompleted += delegate { done.Set(); };
runner.RunWorkerAsync();
bool res = done.WaitOne(TimeSpan.FromSeconds(10));
// This assert fails:
Assert.IsTrue(res, "RunWorkerCompleted was not executed within 10 seconds");
}
Run Code Online (Sandbox Code Playgroud)
我怀疑这个问题与没有消息循环有关,但我不确定.
使用BackgroundWorker有哪些要求?
是否有解决方法使测试工作?
我不认为它与消息泵有关,因为测试通常以阻塞的方式运行.但可能是在"UI"线程上调用了该事件,该线程使用了一个无法处理的Windows消息.
因此,如果问题是消息泵或Windows消息未被处理,您可以尝试这样替换当前bool res = done.WaitOne(TimeSpan.FromSeconds(10));行:
DateTime end = DateTime.Now.AddSeconds(10);
bool res = false;
while ((!res) && (DateTime.Now<end)) {
Application.DoEvents();
res = done.WaitOne(0):
}
Run Code Online (Sandbox Code Playgroud)