【发布时间】:2015-10-22 06:06:53
【问题描述】:
首先,让我描述一下我正在编写的程序的流程。
GUI 中有一个对象列表,当用户单击一个对象时,将从磁盘读取对象数据并加载。这可能需要大约 3-4 秒。
假设用户不耐烦并在第一个对象仍在加载时单击另一个对象。程序将加载第二个对象,同时取消第一个对象的加载。
由于用户可能会在任何加载操作成功完成之前发送垃圾邮件,因此我实施了一个操作块来将所有加载操作排队。
所以我有一个这样的动作块:
this.loadObjectActionBlock = new ActionBlock<CaseObject>(
c => this.LoadCaseData(CaseObject),
new ExecutionDataflowBlockOptions()
{
MaxDegreeOfParallelism = 10,
});
每次用户点击案例对象时,我都会调用:
this.loadObjectActionBlock.Post(CaseObject);
CaseObject 将由我这样定义的函数处理:
private void LoadCaseData(CaseObject caseObject)
{
caseObject.LoadCaseData();
}
我现在需要做的是,我需要等到所有 CaseObject 都加载完毕,然后才能继续我的代码。
我尝试通过调用来检测何时处理所有案例
if (this.loadObjectActionBlock.InputCount == 0)
{
this.loadObjectActionBlock.Complete();
}
在caseObject.LoadCaseData(); 之后,但是当加载动作发生得太快并且动作块被告知不再接受任何输入时,这会导致奇怪的结果。如果我理解正确,InputCount 属性只会查看队列中剩余的作业数。
所以我想做的是等待 ActionBlock 像:
await this.loadObjectActionBlock.Completion;
当队列中的所有内容都已完全处理完毕时。
我可能没有按预期使用 ActionBlock,所以如果有任何替代方案,请提出任何我可以阅读的内容。
TLDR:我想同时处理多个任务(由用户启动)并等待所有任务完成,然后再执行一个任务。
提前致谢:)
【问题讨论】:
标签: c# task-parallel-library tpl-dataflow