Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用TPL ActionBlock,我可以在作业完成后添加新项吗_C#_Asynchronous_Task Parallel Library_Tpl Dataflow - Fatal编程技术网

C# 使用TPL ActionBlock,我可以在作业完成后添加新项吗

C# 使用TPL ActionBlock,我可以在作业完成后添加新项吗,c#,asynchronous,task-parallel-library,tpl-dataflow,C#,Asynchronous,Task Parallel Library,Tpl Dataflow,我在应用程序中使用TPLActionBlock来实现并行性 我有一个基于用户输入执行操作的应用程序。根据输入,有时操作需要更多时间,有时不需要 因此,ActionBlock的真正目的是,每当有输入时,我都想先在UI中显示它(有一个窗口),然后在后台执行操作。因此,这个想法就像来自用户的任何东西,在UI中显示,并在后台并行执行 现在,在UI(窗口)中,我有一个停止按钮来停止用户输入。每当我单击此功能时,用户将无法输入更多内容。现在我调用ActionBlock.Complete方法来检查队列/块是否

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

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

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

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

所以我的疑问是

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

public void CheckJobQ()
{
    _jobs.Complete();
    _jobs.Completion.Wait();
}
\u作业
操作块

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

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

_jobs.Complete();
通过
动作块的动作
进行操作是允许的,完全可以

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

_jobs.Completion.Wait();

…你可能是中弹了自己的脚。操作永远不会完成,块本身也不会完成。

“向数据流块发出信号,表示它不应接受或生成任何消息,也不应使用任何延迟的消息。”——-为什么您认为在ctor中完成操作是一个选项?另外:问题文本与标题如何匹配?你想解决什么问题?这里还有一个疑问,如果我的ActionBlock在调用_jobs.completion.Wait()后已完成,我将如何再次启动新的ActionBlock。这是可能的还是不可能的。当状态机处于其最终状态(“完成”)时,它无法重置,afaik。你需要创建一个新实例。是的,我不会使用不存在的术语“死锁安全”(我明白你的意思)