确保所有线程在c#集成测试后停止

时间:2011-07-27 18:01:21

标签: c# multithreading integration-testing

在我的一些集成测试中,我启动多个线程,并希望确保在集成测试完成时(即使它失败),线程将被清除。谁能推荐一种优雅的方式来做到这一点?

由于

编辑:感谢大家的回答 - 只是为了澄清,'清理'是指测试线程何时停止,测试中的其他一些线程没有QTAgent(测试过程)发出错误。

4 个答案:

答案 0 :(得分:5)

  1. 确保为您创建的每个主题保留Thread对象
  2. 在设置适当的终止信号后,在测试结束时对所有这些呼叫Thread.Join()。如果任何线程没有足够快地终止,那么即使测试本来通过,这也会导致测试失败。
  3. 如果不了解您的应用程序和测试架构,就不可能更详细地回答这个问题。

答案 1 :(得分:3)

如果您使用的是.Net 4.0,并且知道要启动多少个线程,则可以使用CountdownEvent。然后在每个线程中,有一个try / finally块来设置事件。在清理代码中,等待事件。如果您愿意,可以添加超时,并使用它来指示某些错误情况。

答案 2 :(得分:2)

您可以在C#4中使用任务并使用取消令牌和/或处理线程的结尾。见http://msdn.microsoft.com/en-us/library/dd460717.aspx

答案 3 :(得分:1)

使用Thread.Join()将阻止当前线程,直到您调用的线程在退出时加入。在加入之前,您可以根据具体情况发信号通知其他线程以各种方式退出。

调用Thread.Abort()将在目标线程中引发一个中止异常,除非你明确地做了一些事情来阻止它,否则它通常会使它停止。虽然中止不是很优雅。

在测试线程上将Thread.IsBackground设置为true将确保在主线程退出时它们不会使进程保持活动状态。当进程退出时,后台线程将自动处理。

就个人而言,我的大多数测试线程都倾向于采用以下模式:

private static readonly ManualResetEvent m_ThreadsShouldExit = new ManualResetEvent(false);
private static void SomeThreadBody()
{
   while(!m_ThreadsShouldExit.WaitOne(0))
   {
      DoSomething();
   }
}