У меня была такая же проблема со старым API, выставляющим BeginExecute()
и EndExecute()
. BeginExecute()
начал асинхронную операцию, а затем замолчал, пока не завершил выполнение до конца. Но мне нужно было обновить промежуточное состояние хода выполнения в режиме реального времени.
Поэтому я пришел к следующему решению:
var asyncResult = command.BeginExecute();
while (!asyncResult.IsCompleted)
{
if (command.State != OldState)
{
progress.Report(newState);
}
// Key piece in this polling loop.
await Dispatcher.Yield(DispatcherPriority.ApplicationIdle);
}
command.EndExecute(asyncResult);
Сначала я использовал
await Task.Yield();
Но потом я обнаружил, что в WPF он не возвращает управление в GUI, поскольку этот цикл будет иметь более высокий приоритет. Вот почему я перешел на эту инструкцию:
await Dispatcher.Yield(DispatcherPriority.ApplicationIdle);
Так что теперь GUI будет проверять и обновлять прогресс только тогда, когда ему больше нечего делать:)