2016-06-17 3 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) 
} 

На потоке пользовательского интерфейса, я позвоню 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 не могу ждать, пока доклад о ходе работы внутри первого метода асинхронного также завершено.

Это поведение, которое я могу как-то настроить, чтобы соответствовать моей потребности?

Спасибо.

Редактирование: предположим, что между двумя задачами существует неасинхронный код, и эти три вместе завершают общий процесс, и каждый из них будет обновлять прогресс по мере их запуска, поэтому им придется обновлять пользовательский интерфейс в последовательный заказ.

+0

Спасибо. Я обновил вопрос, чтобы уточнить мою проблему. Это в основном задачи, вместе завершая общий процесс, поэтому я хочу, чтобы их обновления прогресса происходили в определенном порядке. – Godsent

ответ

2

Нет, вы не можете «ждать» IProgress.Report. Отчеты о прогрессе, по сути, являются огнем и-забываются.

Вы можете, однако, использовать собственную реализацию IProgress с соответствующей семантикой. В частности, Reactive Extensions хороши для приручения «потоков данных» (в данном случае потоков отчетов о проделанной работе).

+0

Ah..thanks..I может видеть, что 'Progress.Report' использует' SynchronizationContext.Post' для выполнения кода и, как вы сказали, я думаю, что это просто «fire-and-forget» .. есть простой способ выполнить что-то сразу на синхронизациюContext – Godsent

+0

будет использовать synchronizationContext.Send сделать трюк? – Godsent

+0

@ Godsent: Да, 'Send' является синхронным. –

Смежные вопросы