-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;
            }
        }
    }
}

何か案は?

4

3 に答える 3

3

これは、サブスクリプションまたはポーリングを使用して実現できます。

ポーリング(プロセスループの場合)

  • BackgroundWorker

    バックグラウンドで実行され、UIと対話する必要がある単一のタスクがある場合。

  • ThreadPoolスレッド

    効率が必要な場合。スレッドの作成、開始、停止に関連するオーバーヘッドを回避します。長時間実行されるタスク用ではありません。

  • スレッドクラス

    長時間実行されるタスクや、スレッドの実行などをきめ細かく制御する必要がある場合。

添え字

  • ManagementEventWatcher(stuartdが言及したこと)

このシナリオでは、サブスクリプションはおそらくポーリングよりも効率的です。

于 2013-02-06T10:52:48.803 に答える
1

すでに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クラスを使用する方法の例があります。

于 2013-02-06T10:22:12.837 に答える
-1

このようなメソッドを作成できます

 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();                
    }
于 2013-02-06T11:47:03.317 に答える