2013-09-08 6 views
3

Я использую TPL DataFlow и ActionBlock для создания параллелизма. Причина использования TPL DataFlow заключается в том, что он поддерживает асинхронность, за исключением того, что я не могу заставить его работать.Ожидает ActionBlock <T> - TPL DataFlow

var ab = new ActionBlock<Group>(async group => 
{ 
    try { 
     labelStatus.Text = "Getting admins from " + group.Gid; 
     await GetAdminsFromGroup(group.Gid); 
    }catch (ArgumentOutOfRangeException ex) { 
     // Log exception 
    } 

}, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 10 }); 

db.Groups.ToList().ForEach(i => ab.Post(i)); 

ab.Complete(); 

MessageBox.Show("Complete"); 

Поле сообщения отображается почти мгновенно, хотя ActionBlocks все еще работают. Как я могу await до завершения ActionBlock?

ответ

14

ActionBlock<T> предоставляет объект Completion. Это Task, который завершается, когда блок завершил обработку всего. Таким образом, вы можете ждать, что:

ab.Complete(); 
await ab.Completion; 
MessageBox.Show("Complete"); 

Я должен признать, что я не использовал TPL Dataflow себя, но примеры показывают, что должно быть в порядке.

+1

Отличный Джон, это сработало. Я просто смотрел видео на Channel 9, в котором также упоминается свойство Completion. Для всех, кого это интересует, это здесь: http://channel9.msdn.com/posts/TPL-Dataflow-Tour ... Я большой поклонник, я был рад, что вы ответили на мой вопрос :) –