2014-10-28 9 views
1

특정 프로세스가 응답하지 않을 때 (종료 할 때가 아님) 알림을 받기 위해 이벤트를 수신하는 방법이 있는지 궁금합니다.프로세스가 응답을 멈추었을 때 알림을받습니다. (가능하면 C#)

이 솔루션은 특정 프로세스가 응답하는지 여부를 확인할 수 있지만이 솔루션은 폴링과 함께 만 사용할 수 있습니다 (Check status of process). 이 솔루션에서 process.Responding을 "들을"수 있다면 좋을 것입니다.

예를 들어, Windows 컴퓨터에서 모든 Visual Studio 프로세스를 청취하고 싶습니다. 응답이 없으면 알림을 받고 그에 따라 조치를 취할 수 있습니다. 미리 많은 감사드립니다!

+0

효과를 듣기 폴링의 역이다, 당신은 시간에 신호를 보내 앱으로 할 필요가 당신은 청취자가 같은 응답하지 표시 그렇지 않으면 ... 응? –

+0

http://stackoverflow.com/questions/7024626/check-status-of-process-and-restart-process-if-unresponsive-stopped-python –

+0

주기적으로 신호 또는 하트 비트를 보내는 앱 만들기 (등)는 여전히 투표. 실시간 응용 프로그램이 될 것이고 마지막에 며칠 동안 초당 5 번 투표 할 여유가 없기 때문에 전적으로 이벤트 위주의 방법을 찾고 있습니다! : D Windows가 그런 서비스를 제공하는지 궁금합니다 (Google에서 아무 것도 찾을 수 없음) –

답변

1

이와 비슷한 기능이 작동 할 수 있습니다. Task를 사용하여 Process.Responding을 폴링하고 false를 반환하면 이벤트를 발생시키는 기본적인 예제입니다. 나는 적어도 쉽고 간결한 방법으로는 아니지만 주기적으로 프로세스를 폴링 할 수있을 것이라고 생각하지 않습니다.

Task은 백그라운드 스레드에서 실행되어 각 프로세스를 감시하는 동안 주 스레드를 정지시키지 않습니다.

using System.Threading.Tasks; 

namespace System.Diagnostics 
{ 
    public class ProcessEventArgs : EventArgs 
    { 
     public Process Process { get; protected set; } 

     public ProcessEventArgs(Process process) 
     { 
      this.Process = process; 
     } 
    } 

    public delegate void ProcessNotRespondingEvent(object sender, ProcessEventArgs e); 

    public class ProcessMonitor 
    { 
     public event ProcessNotRespondingEvent NotResponding; 

     protected Process mProcess; 

     public ProcessMonitor(Process process) 
     { 
      this.mProcess = process; 
     } 

     public async void Start() 
     { 
      Task t = null; 
      t = Task.Run(() => 
      { 
       while(this.mProcess.Responding) 
        t.Wait(1000); //1 second 

       this.OnNotResponding(); 
      }); 

      await t; 
     } 

     protected void OnNotResponding() 
     { 
      if(this.NotResponding == null) 
       return; 

      ProcessEventArgs e = new ProcessEventArgs(this.mProcess); 
      this.NotResponding(this, e); 
     } 
    } 
} 

사용 예제 :

using System.Linq; 

internal static class Program 
{ 
    private static void Main() 
    { 
     var processes = Process.GetProcessesByName("devenv"); 
     var monitors = processes.Select(p => { 
      var monitor = new ProcessMonitor(p); 
      monitor.NotResponding += (s, e) => { 
       Console.WriteLine("Process {0}(pid: {1}) has stopped responding.", e.Process.ProcessName, e.Process.Id); 
      }; 

      return monitor; 
     }); 

     foreach(var monitor in monitors) 
      monitor.Start(); 
    } 
}