[英]Multiple Task Continuation
我想更清楚地了解这种情况:
考虑以下代码:
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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.