如果我需要取消某个线程上的某些操作,我应该在什么时候使用Thread.Abort vs Thread.Interrupt。我阅读了相关文档,但不确定应该在两者之间使用哪个scneario。
如果有第三种方法,请让我知道它的正反两面。
发布于 2011-05-10 22:00:13
我会不惜一切代价避免使用Thread.Abort。从.NET 2.0开始,它的行为更加安全和可预测,但仍然存在一些相当严重的缺陷。托管代码中的大多数中止都是安全的,但不是所有的。例如,如果在处理静态构造函数的过程中触发中止请求,我认为会有一些微妙的问题。没关系,带外异常可以在任何时候发生,这让您几乎无法控制关闭的安全点所在的位置。
有几种可接受的方法可以优雅地终止线程。
Thread.InterruptWaitHandle events我在我的答案here中讨论了这些方法。
发布于 2013-08-09 19:20:08
大多数建议都已经完成了,但这里有一个我将如何执行的示例:
ManualResetEvent _requestTermination = new ManualResetEvent(false);
Thread _thread;
public void Init()
{
_thread = new Thread(() =>
{
while (!_requestTermination.WaitOne(0))
{
// do something usefull
}
}));
_thread.Start();
}
public void Dispose()
{
_requestTermination.Set();
// you could enter a maximum wait time in the Join(...)
_thread.Join();
}这样,dispose将一直等到线程退出。
如果你需要线程中的延迟,你不应该添加Thread.Sleep。使用WaitOne(delayTime)。这样一来,你就再也不用等着终止它了。
发布于 2011-05-10 21:45:23
我永远不会使用Thread.Abort。它会在几乎任意的时间导致异常。
https://stackoverflow.com/questions/5950994
复制相似问题