首页 > 解决方案 > 当从当前函数内部可见时,我是否应该将 CancellationToken 传递给 Task.Run()

问题描述

我在书中找到的测试取消令牌的代码。只是想知道,为什么token作为参数传递给Task.Run(). 根据我的理解,它是没有用的。我可以省略这个参数,代码将以同样的方式运行。我是正确的?

public static void testCancellationToken()
{
    CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    CancellationToken token = cancellationTokenSource.Token;

    Task task = Task.Run(() =>
    {

        while (!token.IsCancellationRequested)
        {
            Thread.Sleep(1000);
            Console.Write("*");
        }

        token.ThrowIfCancellationRequested();

    },token);

    try
    {
        Console.WriteLine("press any key to stop task");
        Console.ReadLine();
        cancellationTokenSource.Cancel();
        task.Wait();
    }
    catch (AggregateException e)
    {
        Console.WriteLine("got exception "+ e.InnerExceptions[0] );

    }

}

标签: c#

解决方案


代码可能不会以完全相同的方式运行。如果您传递了取消令牌Task.Run,如果取消令牌在任务进入线程池之前发出信号,任务调度程序将根本不会启动您的任务。


推荐阅读