带锁的c#线程池

本文关键字:线程 | 更新日期: 2023-09-27 18:14:41

我真的是c#新手,我渴望学习最有效的方法和实用程序类来帮助处理线程。

我要做的是管理一个作业队列。每个作业都有一个适用的组。作业可以并行运行,但每个组只能运行一个作业。在一组要处理的1000个作业中,可能有100个不同的分组。

在伪代码中应该是:

    var job = Jobs.First(job.GroupNotExecuting);
    job.RunSynchronously();

job.GroupNotExecuting检查该组是否有可用的锁。

在c#中实现这个最好的方法是什么?

如前所述,我是c#的新手,所以只是想为这样的场景获得最佳习惯。协助将不胜感激!

(以防万一,我在Visual Studio 2013, .NET Framework 4.5中工作)

带锁的c#线程池

您可以尝试在每个类中使用布尔值作为"isBusy"标志。当作业开始时,它将"isBusy"设置为true,然后执行它应该执行的操作。但是就在作业完成之前,它将"isBusy"设置为false。

对于调用代码,它只需要检查"isBusy"布尔值。如果为真,则作业仍在运行。如果为false,则任务已完成,或者尚未运行。

或者,利用系统。线程的名称空间。这些给你一个事件,当backgroundworker完成时可以调用。

最后,我使用SemaphorSlim类来处理更新。

对于每个作业,我添加了从共享/静态列表获取信号量并等待它可用的过程。通过这种方式,它们可以被添加到同一个联合池中,并在它们可用时进行处理。

缺点是,理论上,一个线程可能正在等待另一个线程来处理,而在此期间,它可能已经能够寻找另一个任务来处理。