【发布时间】:2017-04-19 11:56:12
【问题描述】:
我有一些旧代码正在尝试为其编写测试。代码解析日志文件(在后台线程上),完成后触发传入的委托。
即
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));
}
代码是生产代码,一切正常并且已经运行了很长时间,但是当我尝试测试它时,我得到“线程被中止”。 Thread_ParseLog 方法中引发的异常。
测试看起来像这样:
void llt(string name, Action<LogData, LRParseState> test) {
finread d = (LogData l, LRParseState s, string e) => {
test(l, s);
};
LogReader.ParseErrorLog(name, d);
}
[TestMethod]
public void Create_LogReader_Big_Log() {
llt(ERROR_LOG, (log, state) => {
Assert.IsTrue(log != null); // never get here!
});
}
测试数据比较大,大约55mb,正常处理大约需要500ms。
我也在输出窗口中遇到错误:
抛出异常:'System.Threading.ThreadAbortException' in mscorlib.dll System.AppDomainUnloadedException:试图访问 卸载 AppDomain。如果测试启动了一个线程,就会发生这种情况 但并没有阻止它。确保所有由 测试在完成前停止。
这似乎指向某种线程同步问题,但我对正在测试的代码无能为力。
显然,这是我编写测试的方式,我可以通过更改测试来修复它,但我不确定它为什么会发生。
TIA。
【问题讨论】:
-
那么问题是什么?
标签: c# multithreading unit-testing