2013-02-06 38 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提到)

在這種情況下訂閱可能比輪詢更高效。