Мне интересно, есть ли способ прослушать событие, чтобы получать уведомления, когда какой-либо конкретный процесс не отвечает (а не когда он выходит!).
Это решение позволяет проверить, реагирует ли какой-либо процесс или нет, но это решение можно использовать только с опросом: проверить статус процесса. Было бы неплохо, если бы я мог "слушать" process.Responding
на это решение.
Например, я хочу слушать все процессы Visual Studio на машине Windows, и если кто-то из них перестает отвечать на запросы, я хочу получить уведомление, чтобы я мог действовать на него соответствующим образом. Спасибо заранее!
Что-то вроде этого может работать. Это немного примитивный пример, который использует Задачи для опроса Process.Responding
и 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();
}
}