C#进程管理
问题描述:
我们正在尝试实现一个启动进程的程序。但同时最多可以有2个进程在内存中运行。如果进程数量超过2个,我们会因许可策略而受到例外。所以基本上我们需要等到2个进程结束,然后再开始2个进程直到完成。 我想检查是否在内存中有2个或更多的进程,让线程睡眠,但它似乎并没有很好地工作C#进程管理
while (Process.GetProcesses().Where(x => x.ProcessName == "myProcessName").Count() >= 2)
{
Thread.Sleep(100);
}
//Start next process
任何想法?非常感谢!
答
可以启动进程并等待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);
}
}
什么异常?你想控制你自己的进程的实例吗? – Yahya 2013-03-22 10:56:40
如果您在尝试等待某个进程存在时遇到问题...请使用Process.WaitforExit()方法。 http://msdn.microsoft.com/en-us/library/fb4aw7b8.aspx – Madushan 2013-03-22 10:57:10
@Yahya我想保留在内存中只有2个进程。我没有实例化他们,我只是想让他们等待,因为只有两个地方))) – Micha 2013-03-22 10:59:09