如果我需要取消线程上的某个操作,我应该在什么时候使用
如果有其他方法,请告诉我它的优缺点。
Thread.Abort
和Thread.Interrupt
。我已经阅读了相关文档,但不确定在两者之间的特定情况下应该使用哪个调用。如果有其他方法,请告诉我它的优缺点。
Thread.Abort
和Thread.Interrupt
。我已经阅读了相关文档,但不确定在两者之间的特定情况下应该使用哪个调用。Thread.Abort
。自 .NET 2.0 版本以来,它的行为更加安全和可预测,但仍存在一些严重的问题。大多数托管代码中的异常可以变得安全,但不是全部。例如,如果在静态构造函数处理期间触发了终止请求,则可能会出现一些微妙的问题。更不用说,非同步异常随时可能发生,使得你无法控制定义关闭点的位置。Thread.Interrupt
WaitHandle
事件大部分的建议已经完成,但是这里有一个例子来说明我如何做:
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)。这样,您将永远不必等待终止它。
我不会使用 Thread.Abort
。它会在几乎任意时间引发异常。
lock
语句按预期工作。但它可能会破坏using
语句。对我来说,这已足够让我永远不使用它。 - CodesInChaos使用Thread.Interrupt
时要小心。如果不加等待或休眠时间,线程将无法被中断。
使用Thread.Abort
时要小心。如果捕获了ThreadAbortException
,则该线程将在catch + finally之后终止。
(我喜欢使用这些方法向我的线程发送信号以让它知道结束时间,然后清理并退出)
catch
块中,您必须调用 Thread.ResetAbort()
。仅为完整起见。 - Paul Kertscher