我正在使用TPL DataFlow和ActionBlock来创建并行性。使用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仍在运行,但消息框几乎立即显示。在ActionBlock完成之前我怎么能await
?
答案 0 :(得分:17)
ActionBlock<T>
公开Completion
属性。这是一个Task
,它在块处理完所有内容时完成。所以你可以等待:
ab.Complete();
await ab.Completion;
MessageBox.Show("Complete");
我必须承认我自己没有使用过TPL Dataflow,但是这些例子表明应该没问题。