非确定性多线程测试

时间:2014-06-13 11:02:52

标签: c# .net multithreading appdomain unhandled-exception

我有一个扩展方法。这是:

public static void BeginInvokeWithAutoEnd(this EventHandler handler, object sender, EventArgs eventArgs)
{
    var buffer = handler;
    buffer.BeginInvoke(sender, eventArgs, buffer.EndInvoke, null);
}

要测试它,有以下方法:

[TestMethod]
public void BeginInvokeWithAutoEnd_SubscribedMethodThrowsException_ExceptionCanBeCaught()
{
    var multiThreadTest = new MultiThreadTest(2);//Class that helps to test asynchronous stuff 
    var thrown = false;
    var ex = new Exception("OOoooOOo!");
    EventHandler onHandler = (s, a) => { throw ex; };
    UnhandledExceptionEventHandler currentDomainOnUnhandledException = (s, args) =>
    {
        thrown = args.ExceptionObject.Equals(ex);
        multiThreadTest.Notify();
    };
    AppDomain.CurrentDomain.UnhandledException += currentDomainOnUnhandledException;

    //Invokes Action from the parameter and waits for multiThreadTest.Notify(); method to be called, otherwise 2 seconds
    multiThreadTest.Act(() => onHandler.BeginInvokeWithAutoEnd(this, EventArgs.Empty));

    AppDomain.CurrentDomain.UnhandledException -= currentDomainOnUnhandledException;
    Assert.IsTrue(thrown);
}

测试本身工作正常,但它随机打破了我的其他测试之一。当我查看破损的测试时,会写出:The agent process was stopped while the test was running.。这意味着在另一个线程中存在未处理的异常,而损坏的测试正在运行。

我不知道怎么会发生这种情况。将在这里感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

尝试使用" .Net Runtime"检查事件查看器(事件查看器 - > Windows日志 - >应用程序)。作为来源。如果存在一些未处理的异常,则应将其记录在那里。

答案 1 :(得分:0)

这对我来说太愚蠢了。

测试的工作流程:
- 测试开始了 - 异常被抛入另一个线程(让我们称之为“线程X”)
- AppDomain.CurrentDomain.UnhandledException被提出 - 测试结束,而“线程X”仍然运行并且还没有完成抛出异常 - “线程X”抛出异常,而另一个测试已经开始

由于某些未知原因,我认为订阅AppDomain.CurrentDomain.UnhandledException将阻止抛出异常。对我来说真傻。