不断监控流程

我编写了一些监视正在运行的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类的例子。