任务并行 - 在所有ContinueWith之后,任务OnCompleted触发器

时间:2014-02-18 14:11:20

标签: c# parallel-processing task

我在处理任务时遇到问题.GetAwaiter()。OnCompleted(新动作)

我有一个带有多个ContinueWith的主任务,但是当我返回主任务并在OnCompleted上添加一个委托时,它会在处理主任务后触发,而不是在所有ContinueWith之后触发

我的问题是,有没有办法知道什么时候继续完成?

这是我目前的代码。

runningTask.Start();
    runningTask.GetAwaiter().OnCompleted(() =>
        {
             KeyValuePair<int, Func<bool>> validator = validationList.FirstOrDefault(x => x.Key == runningTask.Id);
             bool shouldContinue = validator.Value();
             if (shouldContinue)
             {
                  validationList.Remove(validator.Key);
                  PerformExecutionByQueue();
             }
         });

runningTask就是这样创建的

Task runningTask = new Task(delegate method);
Task secondTask = runningTask.ContinueWith(delegate method);

等等。 。

4 个答案:

答案 0 :(得分:1)

当您致电ContinueWith时,请尝试传递TaskContinuationOptions.AttachedToParent。这将告诉任务将延续视为父任务的一部分,并且在继续完成之前不完成父任务。当然,这假设父任务尚未已经完成;如果有,则在您致电ContinueWith()时将继续内联执行。

答案 1 :(得分:1)

ContinueWith创建一个仅在secondTask完成后才会运行的runningTasksecondTask不会阻止runningTask完成,因此OnCompleted事件将在runningTask完成后立即触发。

如果您想在runningTask仍在运行时阻止secondTask完成,请在ContinueWith中使用TaskContinuationOptions.AttachToParent,例如:

Task secondTask = runningTask.ContinueWith(delegate method,
                     TaskContinuationOptions.AttachToParent);

AttachToParent阻止其父任务完成,直到所有子任务完成。另外一个好处是附加任务将在Visual Studio的任务视图

中显示为其父项下的子任务

答案 2 :(得分:1)

将所有调用的结果存储到某个集合中的ContinueWith,然后使用Task.WhenAll在完成所有代码后执行这些代码。

答案 3 :(得分:0)

通过在类级别添加一个事件并在最后一次继续调用它来修复它。