gpt4 book ai didi

c# - 将后台工作人员的数量限制为两个,并在添加时完成工作

转载 作者:太空宇宙 更新时间:2023-11-03 21:24:23 27 4
gpt4 key购买 nike

我目前有一个 treeview,其中 treeView 项目绑定(bind)到一个 ICommand 接口(interface),当项目选择更改如下时调用该接口(interface):

private ICommand _TreeviewSelectedItemChanged;
public ICommand TreeviewSelectedItemChanged
{
get
{
if (_TreeviewSelectedItemChanged == null)
{
_TreeviewSelectedItemChanged = new DelegateCommand(delegate()
{
foreach (TreeViewClass tree in treeViewObsCollection)
{
TreeViewSubItem subItem = tree.mainNodes.FirstOrDefault(s => s.treeViewItemIsSelected);
if (subItem != null)
{
queueofJobs.Enqueue(subItem.subItemName);
//Call Background Worker here?
}
}
});
}
return _TreeviewSelectedItemChanged;
}
}

用户点击的每个 treeView 项目都将添加到这个名为 queueofJobs 的队列中。我想做的是这样的:

  1. 第一次向队列添加项目时,后台工作程序将自动启动以处理与该项目相关的耗时任务。我在这里面临的挑战是,队列可能会根据用户在 TreeView 项目上单击的项目数量而改变。

  2. 后台 worker 在任何时候都应限制为最多 2 个事件,因为操作依赖于读/写并且启动太多会对文件系统性能产生负面影响。

  3. 后台工作人员将执行添加到队列中的所有作业(一次 2 个作业),直到队列变空。

我很好地实现了一个后台 worker ,但我目前在尝试实现上述场景时遇到困难,即作业队列根据用户选择的项目而变化,并且 2 个后台 worker 正在执行队列中的这些作业,直到队列变空.

如果有人可以帮助我指出适合我的问题的方法,那就太好了。任何其他方法而不是 backgroundworker 也可以。提前致谢。

最佳答案

BackgroundWorker不是这个(不再)的正确/最佳工具。您可以使用 TPL Dataflow ActionBlock<T> 为此:

ActionBlock<TreeViewSubItem> workerBlock = 
new ActionBlock<TreeViewSubItem>(i => DoWork(i),
new ExecutionDataflowBlockOptions() { MaxDegreeOfParallelism = 2 });

然后简单地调用:

if (subItem != null)
workerBlock.Post(subItem);

这将通过调用 DoWork 来处理每个子项目(最多并行 2 个)对于单独的线程池线程中的每个项目。

关于c# - 将后台工作人员的数量限制为两个,并在添加时完成工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28167261/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com