使用的时候触发
本文关键字:候触发 | 更新日期: 2023-09-27 17:50:38
谁能给一个例子,我应该使用下一个方法有三个参数。
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
Task.Factory.StartNew(MyTask, token, token);
你能解释一下为什么我们需要第三个参数吗?
StartNew
无过载,即StartNew(Action, CancellationToken, CancellationToken)
无过载。这里最有可能调用的方法是StartNew(Action<object>, object, CancellationToken)
。
此重载启动Action,传递提供的对象(第二个参数)作为该Action的参数。
我只能假设这样做的原因是为了使Action可以参与CancellationToken
提供的合作取消过程。换句话说,它不仅允许Task通过令牌协作取消,而且您可以在Action中使用它,以便尽快退出执行并可能避免ThreadAbortedException。
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
Task.Factory.StartNew(x =>
{
var token = (CancellationToken)x;
for(var item in ReallyBigCollection){
Process(item, token);
if(token.IsCancellationRequested)
return;
}
}, token, token);
没有太多的理由有一个CancellationToken,除非你要使用它。
您似乎对方法签名本身感到困惑。
从你的评论,你实际上调用public Task StartNew(Action<object> action, object state, CancellationToken cancellationToken)
。但是当调用它时,您使用的是下面的Task.Factory.StartNew(MyTask, token, token)
.
所以,是的,你使用token
两次,你试图理解为什么你需要使用token
两次。
答案是你不正确地使用了重载(或没有使用正确的重载)。
如果您查看方法文档,您将看到以下内容:
-
action类型:
System.Action<Object>
-异步执行的动作委托 -
state Type:
System.Object
-包含操作委托使用的数据的对象。 -
cancellationToken Type:
System.Threading.CancellationToken
-将分配给新任务的cancellationToken
所以你基本上是传递一个CancellationToken
作为cancellationToken和状态。
你不需要两个都通过。正如文档中提到的,第二个参数("state")是用于操作委托使用的数据,您正在传递CancellationToken
。当它工作时,您使用的参数不一定是它的本意(这可能会使继承您代码的其他人感到困惑)。
如果没有数据要传递给Action
,那么传递null是完全可以接受的。然后,您可以使用重载与适当的CancellationToken
参数。
为异步操作提供取消令牌,以帮助它在发生某些'取消'事件时确定执行的步骤。显然可以发送null