Метод.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
}
}