不断监控流程
我编写了一些监视正在运行的Windows进程的代码。 我想知道某个过程何时开始以及何时结束。 代码就像我想要的那样工作。
现在,我希望在Windows窗体服务器应用程序中实现它 – 所以只要表单处于活动状态,它就会在循环中运行。 我想我应该让它可以使用BackgroundWorker
异步运行。 我只是不确定最好的方法是什么以及如何做到这一点。
这是我的监视器代码:
using System; using System.Management; using System.Diagnostics; using System.Collections.Generic; using System.ComponentModel; class ProcessMonitor { public static void Main() { Dictionary newProcs= new Dictionary (); while (true) { foreach (Process process in Process.GetProcesses()) { if (process.ProcessName.CompareTo("Someprocess") == 0) { if (!searchForProcess(newProcs, process.Id)) { ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT CommandLine FROM Win32_Process WHERE ProcessId = " + process.Id); foreach (ManagementObject @object in searcher.Get()) { Console.Write("Adding new Process: "); Console.WriteLine(@object["CommandLine"] + " "); newProcs.Add(@object["CommandLine"] + " ", process); } } } } checkProcesses(newProcs); } Console.WriteLine("Done"); } private static bool searchForProcess(Dictionary newProcs, int newKey) { foreach (Process process in newProcs.Values) { if (process.Id == newKey) return true; } return false; } private static void checkProcesses(Dictionary newProcs) { foreach (string currProc in newProcs.Keys) { bool processExists = false; foreach (Process process in Process.GetProcesses()) { if (process.Id == newProcs[currProc].Id) { processExists = true; break; } } if (!processExists) { Console.Write("Process Finished: "); Console.WriteLine(currProc); newProcs.Remove(currProc); if (newProcs.Count == 0) break; } } } }
有任何想法吗?
你可以创建一个像这样的方法
public static void Thread1() { //paste your main code hear }
复制并过去所有代码,主要写入这个新方法。
把主要改成这样的一些
public static void Main() { Console.WriteLine("Before start thread"); Thread tid1 = new Thread(new ThreadStart(Thread1 ) ); tid1.Start(); }
这可以使用订阅或轮询来实现。
轮询 (用于流程循环)
-
的BackgroundWorker
如果您有一个在后台运行并需要与UI交互的任务。
-
ThreadPool线程
当需要效率时。 它避免了与创建,启动和停止线程相关的开销。 不适合长时间运行的任务。
-
线程类
对于长时间运行的任务,以及需要对线程执行进行细粒度控制等。
Subscripton
-
ManagementEventWatcher
(斯图尔特提到的)
在这种情况下,订阅可能比轮询更有效。
由于您已经在使用WMI,我建议您使用临时事件订阅来监视进程的更改。 该过程可以是同步,异步或半同步( 通常是建议的选择 ),您可以使用WITHIN子句指定轮询间隔。
此查询监视进程创建事件:
SELECT TargetInstance FROM __InstanceCreationEvent WHERE TargetInstance ISA "Win32_Process" -- or Win32_ProcessStartTrace
这个观看过程结束事件:
SELECT TargetInstance FROM __InstanceDeletionEvent WHERE TargetInstance ISA "Win32_Process" -- or Win32_ProcessStopTrace
这个问题有一个如何在C#中使用ManagementEventWatcher类的例子。