Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 到CurrentThread.Abort或不到CurrentThread.Abort_C#_.net_Multithreading - Fatal编程技术网

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
    可以更好地处理取消