Я запускаю модульный тест MS в VS2010, чтобы протестировать мое многопоточное приложение.
Приложение использует 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()
после 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 - происходит ли что-то смешное с параллельными тестами и использованием потоков в этом сценарии, которые могут вызывать проблемы? Насколько я понимаю, тесты выполняются последовательно, но я не уверен, что это правильно.