2016-06-17 41 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'是同步的。 –

相關問題