多任务继续

时间:2014-01-16 06:24:12

标签: c# task-parallel-library async-await continuations

我想更清楚地理解这种情况:

请考虑以下代码:

frmProgressAsync prog = new frmProgressAsync(true);
TaskWithProgress t = new TaskWithProgress("Smoothing CP", true);
t.Task = A.ShowMovingAverage(tension,t.Progress)
       .ContinueWith(prev =>
           {
               t.ProgressInformation.Report("Smoothing FG");
               B.ShowMovingAverage(tension, t.Progress);
           });
await prog.RunAsync(t);

我希望运行A.ShowMovingAverageB.ShowMovingAverage两项任务。两者都返回任务。

prog.RunAsync()方法中,我有以下内容:

    public virtual Task RunAsync(TaskWithProgress task)
    {
        Show();
        TaskIsRunning();
        task.ContinueWith(Close(), CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, this._Scheduler);
        return task.Task;
    }

如此有效地我有三个任务,在前一个完成后依次运行。

现在我的问题是在某些情况下,第一项任务几乎立即完成。当调用prog.RunAsync()并且最后一个延续被附加到任务时,它立即运行,关闭表单。

我可以看到我是否在最后ContinueWith()次呼叫中断,任务状态为RanToCompletion,但我希望继续将其重置为正在进行中。

有人可以更干净地解释一下这种行为吗?并提供一个潜在的解决方案,以便在最后的延续之前完成所有任务(延续)?

1 个答案:

答案 0 :(得分:4)

任务只完成一次。附加延续时,您将创建一个在前项任务完成时启动的新任务。所以,我相信你看到的问题是RunAsync附加Close延续,但没有对延续任务做任何事情;考虑task.Task = task.ContinueWith(Close(), ...)

但是,我建议您使用await代替ContinueWith。我发现通常会澄清代码并使其更容易理解。

frmProgressAsync prog = new frmProgressAsync(true);
TaskWithProgress t = new TaskWithProgress("Smoothing CP", true);
t.Task = ShowMovingAveragesAsync(A, B, tension, t.Progress);
await prog.RunAsync(t);

private async Task ShowMovingAveragesAsync(TA A, TA B, TT tession, IProgress<string> progress)
{
  progress.Report("Smoothing FG");
  await A.ShowMovingAverageAsync(tension, progress);
  progress.Report("Smoothing FG");
  await B.ShowMovingAverageAsync(tension, progress);
}

public virtual async Task RunAsync(TaskWithProgress task)
{
  Show();
  TaskIsRunning();
  await task;
  Close();
}