I'm using NUnit to test View Models in a WPF 3.5 application and I'm using the BackgroundWorker
class to execute asynchronous commands.The unit test are running fine with the NUnit runner or ReSharper runner but fail on TeamCity 5.1 server.
How is it implemented :
I'm using a ViewModel
property named IsBusy
and set it to false on BackgroundWorker.RunWorkerCompleted
event. In my test I'm using this method to wait for the BackgroundWorker to finish :
protected void WaitForBackgroundOperation(ViewModel viewModel)
{
Console.WriteLine("WaitForBackgroundOperation 1");
int count = 0;
while (viewModel.IsBusy)
{
Console.WriteLine("WaitForBackgroundOperation 2");
RunBackgroundWorker();
Console.WriteLine("WaitForBackgroundOperation 3");
if (count++ >= 100)
{
Assert.Fail("Background operation too long");
}
Thread.Sleep(1000);
Console.WriteLine("WaitForBackgroundOperation 4");
}
}
private static void RunBackgroundWorker()
{
Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { }));
System.Windows.Forms.Application.DoEvents();
}
Well, sometimes it works and sometimes it hangs the build. I suppose it's the Application.DoEvents()
but I don't know why...
Edit: I added some traces (see code above) and in the log I have :
WaitForBackgroundOperation 1
WaitForBackgroundOperation 2
WaitForBackgroundOperation 2
WaitForBackgroundOperation 2
...
How is it possible ?!