Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于限制进程数的静态变量_C# - Fatal编程技术网

C# 用于限制进程数的静态变量

C# 用于限制进程数的静态变量,c#,C#,我有一个类的多个实例,该类有一个函数,该函数执行一些持续超过一小时的进程,我需要允许在所有实例中一次最多运行2个进程,如果进程数为2,那么它必须等待,直到running process的值小于2,所以我提出了这个方法 public class SomeClass { private static int _ProcessesRunningCount=0; public int ProcessesRunningCount {

我有一个类的多个实例,该类有一个函数,该函数执行一些持续超过一小时的进程,我需要允许在所有实例中一次最多运行2个进程,如果进程数为2,那么它必须等待,直到running process的值小于2,所以我提出了这个方法

    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