等待ActionBlock <t> - TPL DataFlow </t>

时间:2013-09-08 16:38:10

标签: c# task-parallel-library tpl-dataflow

我正在使用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

1 个答案:

答案 0 :(得分:17)

ActionBlock<T>公开Completion属性。这是一个Task,它在块处理完所有内容时完成。所以你可以等待:

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

我必须承认我自己没有使用过TPL Dataflow,但是这些例子表明应该没问题。