多任务延续(Multiple Task Continuation)

2019-10-19 06:07发布

我想了解这个场景更清晰一点:

考虑下面的代码:

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 ,但我有种期待延续重置此回正在进行中。

可能有人请稍微更干净解释这种现象? 并提供一个潜在的解决方案,使所有任务(延续)最终延续前完成?

Answer 1:

任务只能完成一次。 当您将延续,你所创建的先行任务完成时会启动新任务。 所以,我相信你所看到的问题是, 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();
}


文章来源: Multiple Task Continuation