首页 > 解决方案 > 在没有“Thread.Abort()”的情况下立即停止 C# 线程

问题描述

public class Worker
{
    private CancellationTokenSource cts;
    private Thread t;

    public Worker()
    {
        cts = new CancellationTokenSource();
        t = new Thread(() => { ThreadTask(cts.Token); });
    }

    ~Worker()
    {
        cts.Dispose();
    }

    private void ThreadTask(CancellationToken ct)
    {
        try
        {
            while (true)
            {
                if (ct.IsCancellationRequested)
                {
                    Debug.WriteLine("Cancelllation requested");
                    break;
                }

                // long task 1
                Debug.WriteLine("Task 1 completed");
                Thread.Sleep(2000);
                // long task 2
                Debug.WriteLine("Task 2 completed");
                Thread.Sleep(2000);
                // long task 3
                Debug.WriteLine("Task 3 completed");
                Thread.Sleep(2000);
                // long task 4
                Debug.WriteLine("Task 4 completed");
                Thread.Sleep(2000);
                Debug.WriteLine("All tasks completed");
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Thread exception: " + ex.ToString());
        }
        finally
        {
            // cleanup
            Debug.WriteLine("Thread cleanup");
        }
    }

    public void Start()
    {
        t.Start();
    }

    public void Stop()
    {
        cts.Cancel();
    }
}

我想知道是否可以在线程完成执行之前中断它。

例如,在上面描述的代码中,当调用一个函数时Stop(),线程将在它完成执行后停止,我想更快地停止它,例如在“长任务”之间甚至在Thread.Sleep(2000).

Stop()一个解决方案是在调用like时可能在任务线程中抛出异常Thread.Abort(),但Thread.Abort()在 Net 6.0 上不起作用,我该怎么做?

环境:

标签: c#.netmultithreadingabort

解决方案


您可以使用该Thread.Interrupt方法。当前的 .NET 平台支持此 API。

中断处于WaitSleepJoin线程状态的线程。

如果该线程当前没有被阻塞在等待、睡眠或加入状态,它将在下一次开始阻塞时被中断。

ThreadInterruptedException在被中断的线程中抛出,但直到线程阻塞。如果线程从不阻塞,则永远不会抛出异常,因此线程可能会在不被中断的情况下完成。

您必须在委托ThreadInterruptedException主体内部处理可能的情况,否则在调用 时进程可能会崩溃。或者您可以使用通用处理程序处理所有异常,就像您目前正在做的那样。ThreadStartInterruptcatch (Exception)


推荐阅读