代码之家  ›  专栏  ›  技术社区  ›  vico

当从当前函数内部可见时,是否应将cancellationtoken传递给task.run()。

c#
  •  0
  • vico  · 技术社区  · 5 年前

    对我在书中找到的测试取消令牌进行编码。只是想知道为什么 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] );
    
        }
    
    }
    
    2 回复  |  直到 5 年前
        1
  •  0
  •   Miro Hudak    5 年前

    不是真的。在您的情况下,有取消令牌来表示 while 循环以停止循环。

    取消标记被其他代码使用,这些代码可以停止其他线程的执行-例如,您有一个长期运行的可取消操作,并且在运行时显示一个带有取消按钮的对话框窗口。

    你提供 CancellationToken 对你 async Task 通过 cancellationTokenSource 当用户按下“取消”按钮时, cancellationTokenSource.Cancel() 方法,这将导致与此源关联的所有令牌标记取消状态。

    如果 async 方法已正确实现,它将在第一个可能的时刻取消。

    最佳实践是提供 取消令牌 每个可取消的参数(即使默认) 异步的 方法签名(当然还有实现),以便调用方可以在其代码中实现取消。

        2
  •  0
  •   Nick    5 年前

    代码的运行方式可能不完全相同。如果您通过取消令牌 Task.Run 如果取消令牌在任务进入线程池之前收到信号,则任务计划程序根本不会启动任务。