我想知道将令牌分配给异步任务的原因,如下例所示:
var ctSource = new CancellationTokenSource();
Task.Factory.StartNew(() => doSomething(), ctSource.Token);
除了将令牌分配给任务外,MSDN文档还坚持将令牌传递给正在运行的方法,但对我而言,它看起来是一种不自然的重复。
如果为某项任务分配了一个令牌,那么ctSource.Cancel()
是否会为该任务自动触发TaskCancelledException
?
有没有办法从任务中检索分配的令牌(除了将其作为参数发送)?
如果这些都没有,那么将令牌分配给任务的原因是什么?
答案 0 :(得分:1)
- 如果为某个任务分配了一个令牌,那是否意味着,ctSource.Cancel()会自动触发该任务的TaskCancelledException?
醇>
任务可以随时,现在或以后开始。因此,如果在该任务开始之前令牌发生了取消请求,则调度程序本身将抛出var app = {
data1: ''
setData1: function(value){
this.data1 = value;
}
}
,并且永远不会调用您的操作OperationCanceledException
。因此,令牌传递给工厂,而不是任务。这由() => doSomething()
方法使用。
- 有没有办法从任务中检索分配的令牌(除了将其作为参数发送)?
醇>
没有。任务不知道StartNew(...)
,只知道实现。任务不会自动取消。任务中运行的函数负责在请求取消时退出。
您是CancellationToken
的所有者。所以把它传递给任何需要它的人。
CancellationTokenSource
如果您不是Task.Factory.StartNew(() => doSomething(ctSource.Token), ctSource.Token);
(来自第三方DLL)的所有者,则您无法取消该操作,除非它接受doSomething()
。