我想更清楚地理解这种情况:
考虑以下代码:
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.ShowMovingAverage
和 B.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/