2013-02-06 36 views
-1

我写了一些代码来监视正在运行的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<string, Process> newProcs= new Dictionary<string, Process>(); 
     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<string, Process> newProcs, int newKey) 
    { 
     foreach (Process process in newProcs.Values) 
     { 
      if (process.Id == newKey) 
       return true; 
     } 

     return false; 
    } 
    private static void checkProcesses(Dictionary<string, Process> 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; 
      } 
     } 
    } 
} 

任何想法?

+0

你是什么意思与“Windows窗体应用程序服务器”? –

+0

您可以使用计时器。你有任何规范应该如何工作? – Jocke

+0

我的服务器端是一个Windows窗体应用程序,而不是控制台应用程序。基本上,我的客户端向服务器发送命令请求,服务器运行它们。我希望跟踪这些命令,并在每个命令完成时向客户端发送通知。 – Idanis

回答

-1

u能创建这样

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();     
    } 
+0

好的,我在服务器上做了这个。现在的问题是,如果我使用'tid1.Start();'然后出于某种原因,窗体不关闭,当我点击“x”按钮关闭它..任何想法? – Idanis

+0

您必须在窗体关闭事件中调用'tid1.Stop();' –

1

由于您已经在使用WMI,我建议您使用temporary event subscription来监视进程的更改。该过程可以是同步的,异步的,或半同步(usually the recommended choice),你可以用WITHIN clause.

此查询手表过程创建事件指定一个轮询间隔:

SELECT TargetInstance FROM __InstanceCreationEvent 
    WHERE TargetInstance ISA "Win32_Process" -- or Win32_ProcessStartTrace 

这一个手表处理结束事件:

SELECT TargetInstance FROM __InstanceDeletionEvent 
    WHERE TargetInstance ISA "Win32_Process" -- or Win32_ProcessStopTrace 

This question对如何使用ManagementEventWatcher类在C#中的例子。

3

这可以使用Subscription或Polling来实现。

轮询(用于过程环路)

  • BackgroundWorker的

    如果你有在后台运行,并需要与UI交互的单个任务

  • 线程池螺纹

    当效率是期望的。它避免了与创建,启动和停止线程相关的开销。不适合长时间运行的任务。

  • Thread类

    对于长时间运行的任务,当你需要在线程的执行等进行细粒度的控制。

Subscripton

  • ManagementEventWatcher(什么stuartd提到)

在这种情况下订阅可能比轮询更高效。