Получать уведомления, когда процесс перестает отвечать (предпочтительно C #)

1

Мне интересно, есть ли способ прослушать событие, чтобы получать уведомления, когда какой-либо конкретный процесс не отвечает (а не когда он выходит!).

Это решение позволяет проверить, реагирует ли какой-либо процесс или нет, но это решение можно использовать только с опросом: проверить статус процесса. Было бы неплохо, если бы я мог "слушать" process.Responding на это решение.

Например, я хочу слушать все процессы Visual Studio на машине Windows, и если кто-то из них перестает отвечать на запросы, я хочу получить уведомление, чтобы я мог действовать на него соответствующим образом. Спасибо заранее!

  • 0
    Прослушивание по сути является противоположностью опроса, вам нужно приложение, чтобы посылать сигнал в определенный период времени, и вы слушаете, чтобы пометить его как не отвечающий, если он не ... а?
  • 0
    См. Stackoverflow.com/questions/7024626/…
Показать ещё 2 комментария
Теги:

1 ответ

1

Что-то вроде этого может работать. Это немного примитивный пример, который использует Задачи для опроса 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();
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню