Zen*_*Zen 7 c# multithreading .net-4.0 task task-parallel-library
我的代码中有以下几行:
var taskA = Task.Factory.StartNew(WorkA);
var taskB = Task.Factory.StartNew(WorkB);
var allTasks = new[] { taskA, taskB };
Task.Factory.ContinueWhenAll(allTasks, tasks => FinalWork(), TaskContinuationOptions.OnlyOnRanToCompletion);
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时,我收到以下错误:
从多个任务中排除延续的特定延续种类是无效的.
这是由TaskContinuationOptions.OnlyOnRanToCompletion选项引起的.
我的问题是如何检查所有任务是否已正常工作(所有任务状态是RanToCompletion)然后执行FinalWork()?与此同时,应用程序执行其他任务.
Zen*_*Zen 12
根据@Peter Ritchie和@Ben McDougall的答案,我找到了一个解决方案.我修改了代码,通过删除冗余的变量tasks
和TaskContinuationOptions.OnlyOnRanToCompletion
var taskA = Task.Factory.StartNew(WorkA);
var taskB = Task.Factory.StartNew(WorkB);
var allTasks = new[] { taskA, taskB };
Task.Factory.ContinueWhenAll(allTasks, FinalWork);
Run Code Online (Sandbox Code Playgroud)
在哪里FinalWork
:
private static void FinalWork(Task[] tasks)
{
if (tasks.All(t => t.Status == TaskStatus.RanToCompletion))
{
// do "some work"
}
}
Run Code Online (Sandbox Code Playgroud)
如果所有人tasks
都有状态RanToCompletion
,那么"一些工作"将会完成.它将在所有任务完成后立即执行,不会阻止主任务.如果我至少取消其中一项任务,则不会执行任何操作.
或者你可以这样做,
var taskA = Task.Factory.StartNew(WorkA);
var taskB = Task.Factory.StartNew(WorkB);
var allTasks = new[] { taskA, taskB };
var continuedTask = Task.WhenAll(allTasks).ContinueWith((antecedent) => { /*Do Work*/ }, TaskContinuationOptions.OnlyOnRanToCompletion));
Run Code Online (Sandbox Code Playgroud)