I am using TPL DataFlow and an ActionBlock to create parallelism. The reason for using TPL DataFlow is because it supports asynchronicity, except I can't get it to work.
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");
The message box is displaying almost instantly, although the ActionBlocks still run. How can I await
until the ActionBlock is complete?
ActionBlock<T>
exposes a Completion
property. That's a Task
which completes when the block has finished processing everything. So you can await that:
ab.Complete();
await ab.Completion;
MessageBox.Show("Complete");
I must admit I haven't used TPL Dataflow myself, but the examples suggest that should be okay.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With