繁体   English   中英

使用 TPL ActionBlock,我可以在作业完成后添加一个新项目吗

[英]using TPL ActionBlock, Can I add a new item after the job completed

我在我的应用程序中使用 TPL ActionBlock来实现并行性。

我有一个应用程序将根据用户输入执行操作。 根据输入,有时操作需要更多时间,有时不需要。

所以ActionBlock的真正目的是每当输入出现时,我想首先在 UI 中显示它(有一个窗口),然后在后台执行操作。 所以这个想法就像来自用户的任何东西,在 UI 中显示并在后台并行执行。

现在,在 UI(窗口)中,我有一个停止按钮来停止用户输入。 每当我单击此 function 时,用户将无法再输入任何内容。 现在我也在调用ActionBlock.Complete方法来检查队列/块是否完成。

所以我的疑问是,

我将ActionBlock.Complete()作为基于停止按钮单击的单独方法调用,它将等待作业完成然后做一些工作并关闭 UI。 这真的是一个好主意,还是我必须在构造函数内或定义ActionBlock的地方调用ActionBlock.Complete()

public void CheckJobQ()
{
    _jobs.Complete();
    _jobs.Completion.Wait();
}

_jobsActionBlock

var executionDataflowBlockOptions = new ExecutionDataflowBlockOptions()
{
    MaxDegreeOfParallelism = 100
};
_jobs = new ActionBlock<Tuple<Action<Element>, Element>>((job) =>
{
    job.Item1.Invoke(job.Item2);
}, executionDataflowBlockOptions);

所有数据流块都是线程安全的,因此调用:

_jobs.Complete();

...从一个ActionBlock的动作是允许的,完全没问题。

另一方面,数据流块不是死锁安全的。 因此,如果您在处理元素时等待块的完成:

_jobs.Completion.Wait();

...您可能已经在脚上开枪了。 该动作将永远不会完成,块本身也不会。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM