2016-06-17 37 views
1

我遵循以下模式:https://blogs.msdn.microsoft.com/dotnet/2012/06/06/async-in-4-5-enabling-progress-and-cancellation-in-async-apis/,所以我在异步方法中使用IProgress.Report来报告进度。我可以等待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后执行已完成,这有点打乱了进度报告,因为我期待第一的await可以等待,直到第一个异步方法里面的进度报告也完成了。

这是一种行为,我可以调整以适应我的需要?

谢谢。

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

+0

谢谢。我更新了问题以澄清我的问题。基本上,任务是一起完成整个过程,所以我希望他们的进度更新按特定顺序进行。 – Godsent

回答

2

不,您不能“等待”IProgress.Report。进度报告本质上是不可或缺的。

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

+0

啊..谢谢..我可以看到'Progress.Report'使用'SynchronizationContext.Post'来执行代码,就像你说的我猜这只是'忘记'了..是否有一种简单的方法来执行立即在同步上下文的东西 – Godsent

+0

将使用synchronizationContext.Send做诡计? – Godsent

+0

@Godsent:是的,'Send'是同步的。 –

相关问题