コード例 #1
0
        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();
        }
コード例 #2
0
        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();
        }