2013-03-22 2 views
0

프로세스를 시작하는 프로그램을 구현하려고합니다. 그러나 동시에 최대 2 개의 프로세스가 메모리에서 실행될 수 있습니다. 프로세스 수가 2보다 크면 라이센스 정책으로 인해 예외가 발생합니다. 그래서 기본적으로 우리는 2 개의 프로세스가 끝날 때까지 기다렸다가 끝날 때까지 또 다른 2 개의 프로세스를 시작해야합니다. 나는 2 개 이상의 프로세스 후 확인이 스레드 수면가 메모리에 있는지 확인하기 위해 시도했지만 잘C# 프로세스 관리

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

어떤 아이디어를 작동하지 않는 것? 고마워요!

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

어떤 예외? 자신의 프로세스 인스턴스화를 제어 하시겠습니까? – Yahya

+1

프로세스가 존재할 때까지 기다리는 데 문제가 있으면 Process.WaitforExit() 메서드를 사용하십시오. http://msdn.microsoft.com/en-us/library/fb4aw7b8.aspx – Madushan

+0

@Yahya 나는 단지 2 개의 프로세스 만 기억하고 싶다. 나는 그것들을 인스턴스화하지 않는다. 단지 두 개만의 장소가 있기 때문에 기다리게하고 싶다.))) – Micha

답변

2

보인다 이전에 실행중인 프로세스가 모두 종료 된 경우 이미 실행중인 프로세스를 고려하고 새로운 프로세스 만 시작합니다.

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()); 
    } 
1

당신은 프로세스를 시작하고 Exited 이벤트가과 같이 서로를 다시 시작할 때까지 기다릴 수있는 시간에 실행하기 위해 SemaPhore이 필요한 것처럼

+0

은 우아한 해결책처럼 보인다. – Micha

0

우리는 발견 임시 방편 :

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