我想取消其中包含多项任务的任务,例如:
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);
但没有效果,任务正在运行。
答案 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.ThrowIfCancellationRequested
或CancellationToken.Register
来响应取消的自己的代码
旁注,Cancellation is cooperative。正如我在博客上解释的那样,您应该使用Task.Run
代替。尤其是StartNew
is an anti-pattern;他们不会中止您的代码。要获得正确的取消支持,您必须编写响应CancellationToken
的代码。
答案 1 :(得分:0)
除了Stephen Cleary
MSDN州:
在Task类中,取消涉及用户委托(代表可取消操作)和请求取消的代码之间的协作。成功取消涉及请求代码调用CancellationTokenSource.Cancel方法,并且用户委托及时终止操作。