이와 비슷한 기능이 작동 할 수 있습니다. 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();
}
}
효과를 듣기 폴링의 역이다, 당신은 시간에 신호를 보내 앱으로 할 필요가 당신은 청취자가 같은 응답하지 표시 그렇지 않으면 ... 응? –
http://stackoverflow.com/questions/7024626/check-status-of-process-and-restart-process-if-unresponsive-stopped-python –
주기적으로 신호 또는 하트 비트를 보내는 앱 만들기 (등)는 여전히 투표. 실시간 응용 프로그램이 될 것이고 마지막에 며칠 동안 초당 5 번 투표 할 여유가 없기 때문에 전적으로 이벤트 위주의 방법을 찾고 있습니다! : D Windows가 그런 서비스를 제공하는지 궁금합니다 (Google에서 아무 것도 찾을 수 없음) –