public static void WatchProcess(int processId, Action <int> processQuit) { var data = new ProcessWatcherData { processId = processId, processHandle = Kernel32.OpenProcess(Kernel32.ProcessFlags.SYNCHRONIZE, false, processId) }; data.quitActions.Add(processQuit); if (Kernel32.WaitForSingleObject(data.processHandle, 0) != Kernel32.WAIT_TIMEOUT) { Trace.WriteLine($"ProcessWatcherService WatchProcess Error: Unwatchable handle: {processId}"); Kernel32.CloseHandle(data.processHandle); return; } lock (_lock) { if (s_watchers.ContainsKey(processId)) { // We lost the race, add our callback and clean up. s_watchers[processId].quitActions.Add(processQuit); Kernel32.CloseHandle(data.processHandle); } else { // Transfer ownership s_watchers.Add(processId, data); } } EnsureWatcherThreadRunning(); }
public static void WatchProcess(int processId, Action <int> processQuit) { lock (_lock) { if (s_watchers.Any(w => w.Value.processId == processId)) { return; } } Trace.WriteLine($"ProcessWatcherService WatchProcess {processId}"); var data = new ProcessWatcherData { processId = processId, processHandle = Kernel32.OpenProcess(Kernel32.ProcessFlags.SYNCHRONIZE, false, processId) }; data.quitActions.Add(processQuit); lock (_lock) { if (s_watchers.ContainsKey(processId)) { // We lost the race, add our callback and clean up. s_watchers[processId].quitActions.Add(processQuit); Kernel32.CloseHandle(data.processHandle); } else { // Transfer ownership s_watchers.Add(processId, data); } } EnsureWatcherThreadRunning(); }