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 完成之前我该怎么做?

4

1 回答 1

19

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

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

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

于 2013-09-08T16:45:05.520 回答