等待 ActionBlock<T> - TPL 数据流

7

我正在使用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仍在运行,但消息框几乎立即显示。 我该如何await直到ActionBlock完成?

1个回答

19

ActionBlock<T> 暴露了一个 Completion 属性。它是一个 Task,当该块完成处理所有内容时会完成。所以你可以等待它:

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

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


2
太棒了Jon,它起作用了。我刚在Channel 9上观看了一个视频,它也提到了Completion属性。对于任何有兴趣的人,这里是链接:http://channel9.msdn.com/posts/TPL-Dataflow-Tour ...顺便说一句,我是你的忠实粉丝,很高兴你能回答我的问题 :) - James Jeffery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接