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

确保所有线程在c#集成测试后停止,c#,multithreading,integration-testing,C#,Multithreading,Integration Testing,在我的一些集成测试中,我启动了多个线程,并希望确保当集成测试完成时(即使失败),线程将被清理。有人能推荐一种优雅的方法吗 谢谢 编辑:谢谢大家的回答-只是澄清一下,“清理”指的是测试线程停止,而测试中的一些其他线程没有发出错误 确保为创建的每个线程保留Thread对象 设置适当的终止信号后,在测试结束时对所有线程调用Thread.Join()。如果任何线程没有足够快地终止,这将导致测试失败,即使测试本来可以通过 在不了解更多应用程序和测试体系结构的情况下,不可能更详细地回答这个问题。您可以使用C

在我的一些集成测试中,我启动了多个线程,并希望确保当集成测试完成时(即使失败),线程将被清理。有人能推荐一种优雅的方法吗

谢谢

编辑:谢谢大家的回答-只是澄清一下,“清理”指的是测试线程停止,而测试中的一些其他线程没有发出错误

  • 确保为创建的每个线程保留
    Thread
    对象
  • 设置适当的终止信号后,在测试结束时对所有线程调用
    Thread.Join()
    。如果任何线程没有足够快地终止,这将导致测试失败,即使测试本来可以通过

  • 在不了解更多应用程序和测试体系结构的情况下,不可能更详细地回答这个问题。

    您可以使用C#4中的任务,并使用取消令牌和/或处理线程结束。请参见

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

    使用
    Thread.Join()
    将阻止当前线程,直到调用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();
       }
    }
    

    你能解释一下“清理”是什么意思吗。如果线程完成其工作或抛出异常,它们将在没有任何显式干预的情况下消失(除非它们是线程池线程,而不是设计的线程-它们只是返回池)。