我可以等待IProgress.Report

时间:2016-06-17 13:47:35

标签: c# async-await task-parallel-library

我正在遵循https://blogs.msdn.microsoft.com/dotnet/2012/06/06/async-in-4-5-enabling-progress-and-cancellation-in-async-apis/中描述的模式,所以我在异步方法中使用IProgress.Report来报告进度。

public async Task MyFirstTaskAsync(IProgress<T> progress)
{
    progress.report(some T)
}

public async Task MySecondTaskAsync(IProgress<T> progress)
{
    progress.report(some T)
}

在UI线程上,我将按顺序调用MyFirstTaskAsync和MySecondTaskAsync。

var reportProgress1 = new Action<T> (x =>Console.WriteLine("First Step Completed"))
var reportProgress2 = new Action<T> (x =>Console.WriteLine("Last Step Completed"))
var progress1 = new Progress<T>(reportProgress1 )
var progress2 = new Progress<T>(reportProgress2 )
await MyFirstTaskAsync(progress1)
Console.WriteLine("Second Step Comppleted")
await MySecondTaskAsync(progress2)
//code in reportProgress1.report can actually be executed at this point...

我的问题是reportProgress1.report中的代码实际上可以在MyFirstTaskAsync完成后执行,这有点混淆了进度报告,因为我期待第一个等待可以等到第一个异步方法内的进度报告也完成。

这是一种我能以某种方式调整以满足我需要的行为吗?

感谢。

编辑:假设两个任务之间存在一些非异步代码,这三个一起完成整个过程,每个任务都会在运行时更新进度,因此他们必须在顺序中更新UI为了..

1 个答案:

答案 0 :(得分:4)

不,你不能等待&#34;等等。 IProgress.Report。进展报告基本上是一场千载万分。

但是,您可以使用自己的IProgress实现和适当的语义。特别是,Reactive Extensions适用于驯服数据流和#34; (在这种情况下,进度报告流)。