如何限制从C#程序执行的并行进程数?

时间:2019-04-23 17:16:19

标签: c# concurrency process

我需要用C#创建一个代码,该代码将执行一个进程1000次(每次使用不同的命令行参数),并且我希望将并行运行的进程数限制为4。所有其余的将等待,直到至少一个完成,然后再开始下一个。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

您在这里有几个选择

一个是使用Parallel

Parallel.For(0, 1000, new ParallelOptions { MaxDegreeOfParallelism = 4 },
  i =>
  {
    //do something
  });

另一种方法是使用Semaphore

Semaphore pool = new Semaphore(0, 4);

您将在开始工作之前先致电pool.WaitOne(),并在工作结束后致电pool.Release()

或者您可以限制线程池的大小(不推荐)

答案 1 :(得分:0)

您可以将ThreadPool中的最大线程数设置为4:

ThreadPool.SetMaxThreads(4, 4);

然后,您可以在ThreadPool中将1000个进程排队:

        for (int i = 0; i < 1000; i++)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(LaunchProcess));
        }

这是将在后台线程上运行并运行您的进程的方法。它使用WaitForExit()来确保进程在线程完成之前完成。

    static void LaunchProcess(object o)
    {
        var p = new Process();
        p.StartInfo = new ProcessStartInfo("myprocess.exe");
        p.Start();
        p.WaitForExit(); // Critical to wait here for the process to finish
    }

我认为这应该将活动进程的数量限制为4。还没测试。