Asynchronous WinRT将令牌分配给异步任务

Asynchronous WinRT将令牌分配给异步任务,asynchronous,windows-runtime,Asynchronous,Windows Runtime,我想知道将令牌分配给异步任务的原因,如下例所示: var ctSource = new CancellationTokenSource(); Task.Factory.StartNew(() => doSomething(), ctSource.Token); MSDN文档除了将令牌分配给任务外,还坚持将令牌传递给正在运行的方法,但在我看来,这是一个不自然的重复 如果将令牌分配给任务,是否意味着ctSource.Cancel()会自动触发任务的taskcancelledeexce

我想知道将令牌分配给异步任务的原因,如下例所示:

  var ctSource = new CancellationTokenSource();
  Task.Factory.StartNew(() => doSomething(), ctSource.Token);
MSDN文档除了将令牌分配给任务外,还坚持将令牌传递给正在运行的方法,但在我看来,这是一个不自然的重复

  • 如果将令牌分配给任务,是否意味着
    ctSource.Cancel()
    会自动触发任务的
    taskcancelledeexception

  • 是否有方法从任务中检索分配的令牌(而不是将其作为参数发送)

  • 如果两者都不是,那么将令牌分配给任务的原因是什么

  • 如果将令牌分配给任务,是否意味着ctSource.Cancel()会自动触发该任务的TaskCancelledException
  • 任务可以随时开始,现在或以后。因此,如果令牌在该任务开始之前有一个取消请求,那么调度程序本身将抛出
    操作CanceledException
    ,并且您的操作
    ()=>doSomething()
    永远不会被调用。因此,令牌被传递到工厂,而不是任务。这由
    StartNew(…)
    方法使用

  • 是否有方法从任务中检索分配的令牌(而不是将其作为参数发送)
  • 不知道。任务不知道
    取消令牌
    ,只知道实现。任务本身不会自动取消。任务中运行的函数负责在请求取消时退出

    您是
    CancellationTokenSource
    的所有者。所以把它传给任何需要它的人

    Task.Factory.StartNew(() => doSomething(ctSource.Token), ctSource.Token);
    

    如果您不是
    doSomething()
    (来自第三方DLL)的所有者,则无法取消该操作,除非它接受
    CancellationToken

    谢谢莱思给出如此全面的回答。由于无法使用“wait”指定取消令牌,这是否意味着当我的任务正在等待另一个任务时请求取消时,另一个任务仍将运行到完成,直到我重新获得控制并使用令牌停止线程。ThrowifcCancellationRequested?是的,这完全正确。正在运行的任务将一直运行到完成。完成后,您可以检查
    标记。ThrowIfCancellationRequested()