2013-02-15 3 views
1

У меня есть это:Группа несколько асинхронных операций на потоке пользовательского интерфейса

BusyState.SetBusy("Updating Calendar Data"); 

Dispatcher.CurrentDispatcher.Invoke(new Action(async() => 
{ 
    // calling "update" will hit servers outside my control and may take time 
    await PublicCalendars.Update(); 
    await PrivateCalendars.Update(); 

    // clearing the busy state should only happen when both update tasks are finished 
    BusyState.ClearBusy(); 
})); 

В Vars PublicCalendars и PrivateCalendars оба расширения ObservableCollection и заполняются во время вызова, чтобы обновить. Коллекции привязаны к некоторому графическому интерфейсу WPF, поэтому добавление элементов должно происходить из потока пользовательского интерфейса.

Я хотел бы удалить ожидание и позволить оба вызова запускаться одновременно. Как я могу это сделать и все еще иметь свое занятое состояние, когда обе задачи завершены?

+0

Кстати, я не думаю, что 'Dispatcher.CurrentDispatcher.Invoke()' необходимо здесь. Если 'CurrentDispatcher' возвращает правильный диспетчер, это означает, что вы находитесь в потоке пользовательского интерфейса, что означает, что вы можете вызвать все методы напрямую. – svick

ответ

1

Прочность Task s заключается в том, что они могут быть легко скомпонованы. Итак, если вы хотите, чтобы получить Task, который представляет завершение обоих Task с, вы можете использовать метод, который делает это: Task.WhenAll():

await Task.WhenAny(PublicCalendars.Update(), PrivateCalendars.Update()); 

BusyState.ClearBusy(); 

И вы можете также получить очень сходное поведение самостоятельно, сохраняя вернулся Task с и затемawait ИНГ их:

var publicTask = PublicCalendars.Update(); 
var privateTask = PrivateCalendars.Update(); 

await publicTask; 
await privateTask; 

BusyState.ClearBusy(); 
Смежные вопросы