c# - 使用 CancellationTokenSource

标签 c# .net task-parallel-library task

有人可以举个例子,我应该使用带有三个参数的下一个方法。

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/

相关文章:

c# - TPL 数据流,替代 JoinBlock 限制?

c# - SynchronizationContext,什么时候流什么时候不流?

c# - 为什么在命名空间外引用的类型需要完全限定?

c# - 使用 yield return 的语法问题 IEnumerable<T> 方法

.net - Google Analytics API 3 - 错误 :"invalid_grant",描述 :"",Uri :""

c# - Windows 内存和页面文件使用情况

c# - 如何在 MongoDB .Net 中更新插入文档?

.net - TaskFactory.StartNew 或 TaskFactory.FromAsync : which one guarantees faster execution of computation-intensive TPL tasks in application?

c# - 通用扩展中的 Int 转换错误

c# - 直接下载mp3文件