带锁定的C#线程池

时间:2015-09-27 23:57:55

标签: c# multithreading

我是C#的新手,我很想学习最有效的方法和实用程序类来帮助处理线程。

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

在伪代码中它将是:

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

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

在C#中实现此功能的最佳方式是什么?

如前所述,我是C#的新手,所以只想为这样的场景找到最好的习惯。将不胜感激!

(如果重要,我在Visual Studio 2013,.NET Framework 4.5中工作)

2 个答案:

答案 0 :(得分:0)

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

对于调用代码,只需要检查“isBusy”布尔值。如果这是真的,那么工作仍然在运行。如果它是假的,那么工作就完成了,或者还没有完成。

或者,使用System.Threading命名空间。 那些给你一个可以在后台工作完成时调用的事件。

答案 1 :(得分:0)

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

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

缺点是理论上一个线程可能正在等待另一个线程处理,否则它可能会在此期间寻找另一个工作来处理。