C# 用于限制进程数的静态变量
我有一个类的多个实例,该类有一个函数,该函数执行一些持续超过一小时的进程,我需要允许在所有实例中一次最多运行2个进程,如果进程数为2,那么它必须等待,直到running process的值小于2,所以我提出了这个方法C# 用于限制进程数的静态变量,c#,C#,我有一个类的多个实例,该类有一个函数,该函数执行一些持续超过一小时的进程,我需要允许在所有实例中一次最多运行2个进程,如果进程数为2,那么它必须等待,直到running process的值小于2,所以我提出了这个方法 public class SomeClass { private static int _ProcessesRunningCount=0; public int ProcessesRunningCount {
public class SomeClass
{
private static int _ProcessesRunningCount=0;
public int ProcessesRunningCount
{
get {return Interlocked.CompareExchange(ref _ProcessesRunningCount, 0, 0); }
}
public void StartProcessing()
{
if (ProcessesRunningCount < 2)
{
Interlocked.Increment(ref _ProcessesRunningCount);
Task.Factory.StartNew(() => Process());
}
else
{
//wait and start after _ProcessesRunningCount gets to less than 2
}
}
private void Process()
{
//Do the processing
System.Threading.Thread.Sleep(100000);
Interlocked.Decrement(ref _ProcessesRunningCount);
}
}
您可以使用信号量来限制启动的进程数。这里有一个例子,它应该适合您当前的设计。信号量类似于互斥(锁),但它允许多个线程访问关键部分。示例中的
线程
将启动一个进程,并应一直阻塞,直到进程退出。您是否混淆了进程和线程的概念?这些是完全不同的人工制品。你不是在问限制线程的数量,而不是进程的数量吗?@DarinDimitrov不,我不是在一个线程中启动一个进程,我关心限制运行进程的数量,我不关心线程的数量,我一定是误读了你的问题。@DarinDimitrov没有问题;)有趣的是,我会检验它
var A = new SomeClass();
var B = new SomeClass();
var C = new SomeClass();
var D = new SomeClass();
A.StartProcessing(); //process will start
B.StartProcessing(); //process will start
C.StartProcessing(); //process will wait until _ProcessesRunningCount goes under 2
D.StartProcessing(); //process will wait until _ProcessesRunningCount goes under 2