c# - 多任务延续

标签 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,但我有点期待继续将其重置为进行中。

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

最佳答案

任务只能完成一次。当您附加一个延续时,您正在创建一个新任务,该任务在前面的任务完成时开始。所以,我相信您看到的问题是 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();
}

关于c# - 多任务延续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21154692/

相关文章:

c# - 将 session 转换到对象

c# - 非通用声明不允许约束

c# - 当当前任务阻塞时,如何在 .NET 中安排另一项任务?

javascript - 在函数中解决 await

c# - 为什么 Multiple await 需要像 Task.WhenAll() 一样的时间

javascript - Aurelia 对话框和 Typescript 异步等待 - 找不到名称 'await'

c# - Random.NextBytes 有偏见吗?

c# - 在手动调整尺寸之前,窗口无法最大化

c# - 具有永久任务/线程的 TPL 数据流 block

c# - 基于任务的编程在 ASP.Net 页面或异步页面中是否可接受是首选方法