C# 到CurrentThread.Abort或不到CurrentThread.Abort
我已经看到了一些例子,其中有一个线程过程,看起来像这样C# 到CurrentThread.Abort或不到CurrentThread.Abort,c#,.net,multithreading,C#,.net,Multithreading,我已经看到了一些例子,其中有一个线程过程,看起来像这样 private void ThreadProc() { while (serviceStarted) { // do some work Thread.Sleep(new TimeSpan(0, 0, 5)); } Thread.CurrentThread.Abort(); } 最后是否真的需要执行A
private void ThreadProc()
{
while (serviceStarted)
{
// do some work
Thread.Sleep(new TimeSpan(0, 0, 5));
}
Thread.CurrentThread.Abort();
}
最后是否真的需要执行Abort()
有许多参数反对调用Abort()
Abort()
会引发异常,这通常比退出过程更占用资源Thread.Abort()
确实会引发一个异常,如果您编写的代码将被重复使用(或者是基本库的一部分),那么其他开发人员很难处理threadabortexaction
s
这篇文章中解释了关于
我一直听说调用是一种更好的方法,如果您可以等到线程处理完成
我不知道是否有人认为这是一个好的做法。它可能导致死锁(因为在抛出异常时未正确清理非托管资源)
以下是解决此问题的方法和其他方法。有趣的问题。但我建议不要这样做,因为这样的语句会阻止该方法被轻松重用。在自己的线程上调用
Abort()
是安全的,但除此之外,通常应该避免这样做,因为您无法确定其他线程是否会正常终止。在许多情况下,您不需要中止线程。只要让它完成,它就会被回收。一旦循环退出,线程将自行终止。不需要中止线程
CurrentThread.Abort
不仅是多余的,而且确实有害,因为它会引发ThreadAbortException
。如果另一个线程试图Join()
您的服务循环线程,它将不得不处理不必要的异常。最好是删除行CurrentThread.Abort()
当线程没有进一步的工作要做时,线程自然会自动终止:当它执行的逻辑完成时
Thread.Abort()
导致在当前线程上引发ThreadAbortException
,其明确目的是快速终止线程上的所有执行。这是一个特殊的.NET异常,它是“不可调度的”:您可以编写一个catch块,但在catch块完成后,该异常将继续抛出。这确保了后续用户代码无法停止中止线程的指令
调用Thread.Abort()
通常被视为不好的做法,因为有更优雅的方法来终止正在执行的逻辑。使用CancellationToken
可以更好地处理取消