一尘不染

如何中止/取消TPL任务?

c#

在一个线程中,我创建了一些线程System.Threading.Task并启动了每个任务。

当我执行.Abort()杀死线程的操作时,任务不会中止。

如何将传递.Abort()给我的任务?


阅读 238

收藏
2020-05-19

共1个答案

一尘不染

你不能
任务使用线程池中的后台线程。另外,也不建议使用Abort方法取消线程。您可以查看以下博客文章,该文章说明了使用取消令牌取消任务的正确方法。这是一个例子:

class Program
{
    static void Main()
    {
        var ts = new CancellationTokenSource();
        CancellationToken ct = ts.Token;
        Task.Factory.StartNew(() =>
        {
            while (true)
            {
                // do some heavy work here
                Thread.Sleep(100);
                if (ct.IsCancellationRequested)
                {
                    // another thread decided to cancel
                    Console.WriteLine("task canceled");
                    break;
                }
            }
        }, ct);

        // Simulate waiting 3s for the task to complete
        Thread.Sleep(3000);

        // Can't wait anymore => cancel this task 
        ts.Cancel();
        Console.ReadLine();
    }
}
2020-05-19