使用的时候触发

本文关键字:候触发 | 更新日期: 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