C# 实现基于条件启动的排队任务

C# 实现基于条件启动的排队任务,c#,multithreading,task-parallel-library,queueing,C#,Multithreading,Task Parallel Library,Queueing,我正在寻找一个理想的/线程安全的任务队列实现,它将根据内部条件启动每个任务(我也只希望在一个时间间隔内进行检查),同时检查是否没有太多其他任务在运行。我还需要一种方法来返回队列中每个任务的进度 为了提供一些背景信息,我有一个FileSystemWatcher,它会发送一个关于正在创建的新文件夹的事件。然后,当文件夹不再被锁定时,我想将其放入队列以处理该文件夹。但同时我想防止太多的流程任务实例无法运行 这里有一些我想要的伪代码 private static void EventToQueu

我正在寻找一个理想的/线程安全的任务队列实现,它将根据内部条件启动每个任务(我也只希望在一个时间间隔内进行检查),同时检查是否没有太多其他任务在运行。我还需要一种方法来返回队列中每个任务的进度

为了提供一些背景信息,我有一个FileSystemWatcher,它会发送一个关于正在创建的新文件夹的事件。然后,当文件夹不再被锁定时,我想将其放入队列以处理该文件夹。但同时我想防止太多的流程任务实例无法运行

这里有一些我想要的伪代码

    private static void EventToQueue(object sender, EventArgs e)
    {
        ProcessQueue.Enqueue(Task, condition);
    }

    private static async void NewQueueObject(object sender, QueueObject e)
    {
        if (e.Condition && ProcessQueue.ActiveTask < 4)
        {
             var progress = new Progress<int>();

             progress.ProgressChanged += ( s, e ) =>
             {
                 UpdateProgress(e.Value);
             };
             await LongProcess(e, progress);
        }
        else
        {
            e.Delay(30);
        }
    }
私有静态void EventToQueue(对象发送方,EventArgs e)
{
ProcessQueue.Enqueue(任务、条件);
}
私有静态异步void NewQueueObject(对象发送方,QueueObject e)
{
if(如条件和处理队列.ActiveTask<4)
{
var progress=新进度();
progress.ProgressChanged+=(s,e)=>
{
UpdateProgress(即值);
};
等待漫长的过程(e,进展);
}
其他的
{
e、 延误(30);
}
}

您考虑过使用阻塞收集吗?是的,我最初打算用BC实现它。但是我最终有点陷入了一种基于事件的方式,基于这些条件,而不在我的每个T中使用计时器来进行消费的困境。请看这里的答案-。它也是基于事件的(
myWaveIn\u DataAvailable
)。谢谢。我在其他地方见过这种实现,但我不确定它是否是执行事件驱动的生产/消费的正确/最佳方式。当我看到while(true)循环时,我总是有点累。如果只在生产事件中启动消费者(因为你知道一旦我的情况属实,就会有事情发生),并一直运行到没有任何东西可以采取,这是否同样正确?或者这只是浪费时间,因为使用者所在的线程正在阻塞,因此不会影响性能。当然,您可以使用
while(MyCondition())
而不是
while(true)
。至于第二个问题,我认为在每次活动到来时产生一个新的消费者并不是一个好的做法。