Метод.NET SystemEvents не запускается при запуске нового процесса из приложения

По сути, этот вопрос также подводит итог моей проблемы: SystemEvents.SessionEnding не запускается, пока не будет закрыт процесс (открытый до).

Но ответа пока нет. У меня есть консольное приложение, которое запускает другой процесс изнутри себя. Приложение также прослушивает SystemEvents.SessionSwitch. Если я закомментирую код, который запускает дополнительный процесс, срабатывает обработчик события для SessionSwitch. Однако, если я раскомментирую код, который запускает дополнительный процесс, обработчик не срабатывает. Я на 100% уверен, что обработчик событий не запущен из-за запуска нового процесса из моего приложения... Я просто не знаю почему.

Я пометил это как возможную проблему многопоточности, потому что, похоже, это указывалось в некоторых комментариях, высказанных в приведенном выше вопросе. Тем не менее, я совсем не уверен, что может быть причиной.

Вот часть кода.

 [STAThread]
 static void Main(string[] args)
 {
        SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;

        _myFoo = new _myFoo();
        _processManager = new ProcessManager();

        // If I comment out this code block, the SessionSwitch event handler is hit
        // ------------------------------------------------------
        if (args.Length == 0)
        {
            // creates a duplicate process to monitor the current (main) process
            _processManager.StartObserverProcess();
        }
        else
        {
            // start monitoring the main process
            _processManager.ObserveMainProcess(int.Parse(args[0]));
        }
        // ----------------------------------------------------

        _myFoo.Start();
  }

// this method does not get hit if we start the 'duplicate' 
// monitoring process from within ProcessManager
private static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
        if (e.Reason == SessionSwitchReason.SessionLock)
        {
            // Do something when session locked
        }

        if (e.Reason == SessionSwitchReason.SessionUnlock)
        {
            // Do something when session unlocked
        }
}

ProcessManager в основном запускает другой "дублирующий" процесс, который отслеживает, завершается ли текущий процесс (я знаю, что термин "дубликат" здесь, вероятно, не точен). Вот выдержка:

public class ProcessManager
{
    // create a new process to monitor the current process
    // passing in the current process id as args
    public void StartObserverProcess()
    {
        _mainProcess = Process.GetCurrentProcess();
        _mainProcessId = _mainProcess.Id;

        _observerProcess = new Process
        {
            StartInfo =
            {
                FileName = _mainProcess.MainModule.FileName,
                Arguments = _mainProcessId.ToString()
            },
            EnableRaisingEvents = true
        };
        _observerProcess.Exited += OnObserverProcessExit;
        _observerProcess.Start();
    }

    private void OnObserverProcessExit(object sender, EventArgs e)
    {
        // do something on main process exit
    }
}

0 ответов

Другие вопросы по тегам