多任务继续

Sim*_*mon 1 c# continuations task-parallel-library async-await

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

考虑以下代码:

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);
Run Code Online (Sandbox Code Playgroud)

我有两个任务,我希望运行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;
    }
Run Code Online (Sandbox Code Playgroud)

因此,我有效地执行了三个任务,在前一个任务完成之后依次执行一个任务。

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

我可以看到是否在上次ContinueWith()通话时中断,任务状态为RanToCompletion,但我有点期待继续将其重置为正在进行中。

有人可以更清楚地解释这种行为吗?并提供一个可能的解决方案,以使所有任务(延续)在最终延续之前完成?

Ste*_*ary 5

任务仅完成一次。附加延续时,您将创建一个新任务,该任务在前一个任务完成时开始。因此,我相信您看到的问题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();
}
Run Code Online (Sandbox Code Playgroud)

  • 没有; “异步任务”是定义没有返回值的“异步”方法的正确方法。它没有“异步无效”引起的任何问题。 (2认同)