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