【问题标题】:Non-deterministic multithread test非确定性多线程测试
【发布时间】:2014-06-13 11:02:52
【问题描述】:

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

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.。这意味着在另一个线程中存在未处理的异常,而损坏的测试正在运行。

我不知道这怎么会发生。在这里将不胜感激。

【问题讨论】:

  • 因为您正在线程池上开始工作,而不是等待它完成。
  • @usr 你能解释得更准确一点吗?我确实在等待multiThreadTest.Notify();。如果这就是你的意思。
  • BeginInvokeWithAutoEnd 从不等待并立即返回。这意味着调用Act 的行也立即返回。这就是你想要的吗?
  • @usr 方法multiThreadTest.Act(...) 调用它作为参数接收的Action,然后等待multiThreadTest.Notify();
  • 这是有道理的。发布更多代码,尤其是 Act。当您使用调试器单步执行代码时会发生什么?

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


【解决方案1】:

尝试在事件查看器(事件查看器 -> Windows 日志 -> 应用程序)中检查以“.Net Runtime”为源的事件。如果有一些未处理的异常,它们应该被记录在那里。

【讨论】:

    【解决方案2】:

    我真是太傻了。

    测试工作流程:
    -测试开始
    - 在另一个线程中抛出异常(我们称之为“线程 X”)
    -AppDomain.CurrentDomain.UnhandledException 被提出
    - 测试完成,而“线程 X”仍在运行并且尚未完成抛出异常
    -“线程 X”抛出异常,而另一个测试已经开始

    出于某种未知原因,我认为订阅AppDomain.CurrentDomain.UnhandledException 会阻止抛出异常。我真是太傻了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-10
      • 2014-03-22
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      相关资源
      最近更新 更多