マルチスレッド アプリケーションをテストするために、VS2010 で MS 単体テストを実行しています。
アプリケーションは を使用しAutoResetEvent
てスレッドを同期します。これは次のように宣言されます。
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()
afterへの呼び出しがありましたWaitOne()
が、この問題を調査しているときにこれを削除しました。私の調査では、これは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 で単体テストを実行しているときにしか見たことがありません。テストが並行して実行され、このシナリオで問題が発生している可能性があるスレッドの使用で何かおかしいことがありますか? 私の理解では、テストは連続して実行されますが、これが正しいかどうかはわかりません。