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

C# 将后台工作人员的数量限制为两个,并在添加时完成作业,c#,wpf,queue,backgroundworker,C#,Wpf,Queue,Backgroundworker,我目前有一个treeview,其中treeview项目绑定到ICommand接口,当项目选择更改时,该接口将被调用,如下所示: private ICommand _TreeviewSelectedItemChanged; public ICommand TreeviewSelectedItemChanged { get { if (_TreeviewSelectedItemChange

我目前有一个treeview,其中treeview项目绑定到ICommand接口,当项目选择更改时,该接口将被调用,如下所示:

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的队列中。我想做的是这样的:

  • 首次向队列中添加项目后,backgroundworker将自动开始处理与该项目相关的耗时任务。我在这里面临的挑战是,队列可能会根据用户在treeview项目上单击的项目数而变化

  • backgroundworkers在任何时候都应被限制为最多2个活动的,因为操作是读/写相关的,启动太多会对文件系统性能产生负面影响

  • backgroundworkers将执行添加到队列中的所有作业(一次两个作业),直到队列变为空

  • 我可以实现一个backgroundworker,但我目前无法实现上面的场景,即作业队列根据用户选择的项目进行更改,2个backgroundworker从队列中执行这些作业,直到队列变为空


    如果有人能帮我找到解决问题的合适方法,那就太好了。任何其他方法,而不是后台工作也可以。提前感谢。

    BackgroundWorker
    不再是这方面的合适/最佳工具。您可以为此使用的:

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

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

    BackgroundWorker
    不再是用于此的正确/最佳工具。您可以为此使用的:

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

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

    简单、简短、甜蜜。非常感谢你的回答:)简单,简短,甜蜜。非常感谢您的回答:)