C#取消执行包含多个任务的任务

时间:2016-06-15 12:10:11

标签: c# concurrency async-await scheduled-tasks

我想取消其中包含多项任务的任务,例如:

 private async Task<bool> myTask0() {
       var val2 = await myTask2();
       var val3 = await myTask3();            
       return true;
    }

其中:

private async Task<bool> myTask1() {
       //run some tasks in paralell
        var myParallel= arrayValues.Select(fileBEanListItem => manageSrcFilesDownload().ToList();
        return true;
    }

   private async Task<bool> myTask2() {
        return await myTask3();
    }

所以我想提供取消myTask0所有任务的选项 - 只是中止它!有解决方案:

我在尝试:

 var ts = new CancellationTokenSource();
 CancellationToken ct = ts.Token;

 await Task.Factory.StartNew(async () => {
                await myTask0();
        },ct);

当我需要关闭它时,我使用ts.Cancel(true);但没有效果,任务正在运行。

2 个答案:

答案 0 :(得分:2)

jFiddle。所以,你应该通过你的方法传递CancellationToken

private async Task<bool> myTask0(CancellationToken token) {
   var val2 = await myTask2(token);
   var val3 = await myTask3(token);            
   return true;
}

private async Task<bool> myTask1(CancellationToken token) {
   //run some tasks in paralell
   var myParallel= arrayValues.Select(fileBEanListItem => manageSrcFilesDownload(token).ToList();
   return true;
}

private async Task<bool> myTask2(CancellationToken token) {
    return await myTask3(token);
}

依此类推,直到您将令牌传递给可以接受它的API(例如,文件下载),或者直到您拥有使用CancellationToken.ThrowIfCancellationRequestedCancellationToken.Register来响应取消的自己的代码

旁注,Cancellation is cooperative。正如我在博客上解释的那样,您应该使用Task.Run代替。尤其是StartNew is an anti-pattern;他们不会中止您的代码。要获得正确的取消支持,您必须编写响应CancellationToken的代码。

答案 1 :(得分:0)

除了Stephen Cleary

MSDN州:

  

在Task类中,取消涉及用户委托(代表可取消操作)和请求取消的代码之间的协作。成功取消涉及请求代码调用CancellationTokenSource.Cancel方法,并且用户委托及时终止操作。