我在处理任务时遇到问题.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);
等等。 。
答案 0 :(得分:1)
当您致电ContinueWith
时,请尝试传递TaskContinuationOptions.AttachedToParent
。这将告诉任务将延续视为父任务的一部分,并且在继续完成之前不完成父任务。当然,这假设父任务尚未已经完成;如果有,则在您致电ContinueWith()
时将继续内联执行。
答案 1 :(得分:1)
ContinueWith
创建一个仅在secondTask
完成后才会运行的runningTask
。 secondTask
不会阻止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)
通过在类级别添加一个事件并在最后一次继续调用它来修复它。