我在 VS2010 中运行 MS 单元测试来测试我的多线程应用程序。
应用程序使用 anAutoResetEvent
来同步线程,它的声明如下:
private readonly AutoResetEvent captureParsedEvent = new AutoResetEvent(false);
主测试线程(ID:13)
主测试线程启动一个线程来解析一个捕获文件,然后调用WaitOne()
一个AutoResetEvent
,阻塞直到捕获完成:
int id = Thread.CurrentThread.ManagedThreadId;
CaptureManager.Instance.StartProcessingPackets();
Trace.WriteLine("[" + id + "]: WAITING ON CaptureParsedEvent");
captureParsedEvent.WaitOne();
Trace.WriteLine("[" + id + "]: WAITING ON CaptureParsedEvent DONE!");
// Analyse parsed capture...
(旁注:代码最初调用了captureParsedEvent.Reset()
afterWaitOne()
但我在调查此问题时删除了它,因为我的研究得出结论,这对于AutoResetEvent
对象可能不是必需的。)
解析线程(ID:18)
同时,进行解析的线程发出这样的信号AutoResetEvent
:
private void InstanceManagerStateChanged(ManagerStateEventArgs ea, object sender)
{
int id = Thread.CurrentThread.ManagedThreadId;
switch(ea.CurrentState)
{
case ManagerState.ReadPacketsDone:
Trace.WriteLine("\t[" + id + "]: CaptureParsedEvent SIGNAL");
captureParsedEvent.Set();
Trace.WriteLine("\t[" + id + "]: CaptureParsedEvent DONE!");
break;
}
}
通常,一切都运行良好,我在输出窗口中看到以下预期输出:
[13]: WAITING ON CaptureParsedEvent
[18]: CaptureParsedEvent SIGNAL
[18]: CaptureParsedEvent DONE!
[13]: WAITING ON CaptureParsedEvent DONE!
但是,我间歇性地看到以下输出:
[13]: WAITING ON CaptureParsedEvent
[13]: WAITING ON CaptureParsedEvent DONE!
这显然给我带来了问题,因为捕获还没有真正完成解析。
上面的地方是唯一发生的,captureParsedEvent.Set();
所以我知道没有其他人在发出这个事件的信号。
几个问题:
Trace.WriteLine()
线程安全并以正确的顺序输出跟踪吗?我只在 VS2010 中运行单元测试时才看到这个问题——并行运行的测试是否有一些有趣的事情发生,并且在这种情况下使用线程可能会导致问题?我的理解是测试是串行运行的,但不确定这是否正确。