有人可以举个例子,我应该使用带有三个参数的下一个方法。
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
Task.Factory.StartNew(MyTask, token, token);
您能解释一下为什么我们需要第三个参数吗?
最佳答案
StartNew
没有过载即StartNew(Action, CancellationToken, CancellationToken)
。最有可能的是,这里调用的方法是 StartNew(Action<object>, object, CancellationToken)
.
此重载启动操作,传入提供的对象(第二个参数)作为此操作的参数。
我只能假设这样做的原因是为了让该操作可以参与CancellationToken
的合作取消过程。提供。换句话说,它不仅允许任务通过 token 配合取消,而且您可以在操作中使用它以便尽快退出执行并可能避免 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,否则没有太多理由使用它。
关于c# - 使用 CancellationTokenSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30427424/