C#进程管理

问题描述:

我们正在尝试实现一个启动进程的程序。但同时最多可以有2个进程在内存中运行。如果进程数量超过2个,我们会因许可策略而受到例外。所以基本上我们需要等到2个进程结束,然后再开始2个进程直到完成。 我想检查是否在内存中有2个或更多的进程,让线程睡眠,但它似乎并没有很好地工作C#进程管理

while (Process.GetProcesses().Where(x => x.ProcessName == "myProcessName").Count() >= 2) 
{ 
Thread.Sleep(100); 
} 
//Start next process 

任何想法?非常感谢!

+0

什么异常?你想控制你自己的进程的实例吗? – Yahya 2013-03-22 10:56:40

+1

如果您在尝试等待某个进程存在时遇到问题...请使用Process.WaitforExit()方法。 http://msdn.microsoft.com/en-us/library/fb4aw7b8.aspx – Madushan 2013-03-22 10:57:10

+0

@Yahya我想保留在内存中只有2个进程。我没有实例化他们,我只是想让他们等待,因为只有两个地方))) – Micha 2013-03-22 10:59:09

好像你需要SemaPhore确保atmax 2进程同时运行

可以启动进程并等待Exited时重新开始另一个像这样:

using System; 
using System.Diagnostics; 

namespace ConsoleApplication1 { 
    class Program { 
     static void StartProcess(string Path) { 
      Process Process = Process.Start(Path); 
      Process.EnableRaisingEvents = true; 
      Process.Exited += (sender, e) => { 
       StartProcess(Path); 
      }; 
     } 

     static void Main(string[] args) { 
      for (int i = 0; i < 2; i++) { 
       StartProcess("notepad"); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 
+0

似乎是优雅的解决方案 – Micha 2013-03-22 11:06:29

这会考虑已经运行的进程,并且只启动新的进程,如果以前运行的进程全部退出。

string processName = "calc"; 
int processCount = 2; 

while (true) 
    { 
    while (Process.GetProcessesByName(processName).Count() < processCount) 
    { 
    Process.Start(processName); 
    } 

    var tasks = from p in Process.GetProcessesByName(processName) 
       select Task.Factory.StartNew(p.WaitForExit); 
    Task.WaitAll(tasks.ToArray()); 
    } 

我们已经找到临时的解决办法:

while (true) 
    { 
    lock (_lock) 
    { 
     if (Process.GetProcesses().Where(x => x.ProcessName == "processName").Count() < GetProcessNumber) 
     { 
     //do Smth 
     break; 
     } 
     Thread.Sleep(1000); 
    } 
    }