2014-02-18 26 views
2

我正在处理task.GetAwaiter()面临的一个问题任务OnCompleted触发OnCompleted(新动作)任务并行 - 上毕竟ContinueWith

我有多个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); 

等创建。 。 。

+0

请您正在使用的语言标记这一点。 –

+0

完成,感谢@RamanShah – DevEstacion

+0

你到底想干什么?如果要在任务完成时执行某些操作,只需在_proper_任务上使用ContinueWith。 TaskAwaiter主要由编译器使用,如果OnComplete始终在特定任务完成执行时触发,而不是在任务状态发生更改(例如,RanToCompletion,Cancelled或Faulted)时触发。 –

回答

1

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

+0

改变了这个答案,更合乎逻辑,并修复了实际问题,没有任何额外的字段 – DevEstacion

1

当你调用ContinueWith,试图传递TaskContinuationOptions.AttachedToParent。这将告诉任务将继续视为父任务的一部分,并且在继续完成之前不要完成父任务。这是假设,当然,父任务还没有已经完成;如果有,则继续将在您拨打ContinueWith()时在线执行。

1

ContinueWith创建一个secondTask只有在runningTask完成后才能运行。 secondTask并不妨碍runningTask精加工而成,所以OnCompleted事件后会runningTask结束immediatelly火。

如果你想防止runningTask精加工而成,而secondTask仍然运行在ContinueWith使用TaskContinuationOptions.AttachToParent,如:

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

AttachToParent防止其父任务未能完成,直到所有的子任务已经完成。另外一个好处是,附加任务将显示为子任务的Visual Studio中的任务视图

+0

我已经试过这个,但它仍然在runningTask后触发。 – DevEstacion

+0

你在调用'ContinueWith()'之前是否启动了'runningTask'?如果是这样,那么任务可以在继续注册之前完成,在这种情况下,可以在'secondTask'完成之前调用awaiter回调。 –

0

家长只需添加上类级别的事件,并要求其在最后继续与固定它之下。