“威胁已经被清除了。”在测试中测试在后台线程上触发委托的代码

时间:2017-04-19 11:56:13

标签: c# multithreading unit-testing

我有一些旧的代码,我正在尝试编写测试。代码解析日志文件(在后台线程上),并在完成时触发传入的委托。

<button id="btn" title="this is a div" disabled>Search</button>

代码是生产代码,并且每件事都运行正常并且已经做了很长时间,但是当我尝试测试它时,我得到了“线程被中止”。 Thread_ParseLog方法中引发的异常。

测试如下:

public delegate void finread(LogData l, LRParseState l, string e="");
void Thread_ParseLog(object info) {
  var info = ti as ThreadInfo;
  // some time later
  info.fin(log, state, error);
}
public static void ParseErrorLog(string log, finread fin){
    var pts = new ParameterizedThreadStart(Thread_ParseLog);
    new Thread(pts).Start(new ThreadInfo(log, fin));
}

测试数据很大,大约55mb,正常处理大约需要500ms。

我也在输出窗口中出错:

  

抛出异常:'System.Threading.ThreadAbortException'中   mscorlib.dll System.AppDomainUnloadedException:试图访问   卸载AppDomain。如果测试启动了一个线程,就会发生这种情况   但没有阻止它。确保所有线程都由   测试在完成前停止。

这似乎指出某种线程同步问题,但我无法对我正在测试的代码做些什么。

显然,这是我编写测试的方式,我可以通过更改测试来修复它,但我不确定它为什么会发生。

TIA。

2 个答案:

答案 0 :(得分:2)

使用同步机制(例如ManualResetEvent)等待测试的异步部分在离开测试方法之前完成。

[TestMethod]
public void Create_LogReader_Big_Log() {
    // Use this event to wait until the asynchronous code has been executed 
    // before leaving the test method
    ManualResetEvent resetEvent = new ManualResetEvent(false);
    LogData logDataReceived = null;

    llt(ERROR_LOG, (log, state) => {
        logDataReceived = log;

        // Signal that the test has reached the end
        resetEvent.Set();
    });

    // Wait for the event to be set
    resetEvent.WaitOne();

    // Additionally wait for a grace period to allow the other thread to fully terminate
    Thread.Sleep(500);

    // Now perform the asserts on the received data
    Assert.IsTrue(logDataReceived != null);
}

答案 1 :(得分:1)

使用异步测试方法并给它一个小延迟来运行。

[TestMethod]
public async Task Create_LogReader_Big_Log()
{
    llt(ERROR_LOG, (log, state) => {
        Assert.IsTrue(log != null); // never get here!
    });
    await Task.Delay(3000);
}