-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

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

轮询(用于进程循环)

  • 后台工作者

    如果您有一个在后台运行的任务并且需要与 UI 交互。

  • 线程池线程

    当需要效率时。它避免了与创建、启动和停止线程相关的开销。不适用于长时间运行的任务。

  • 线程类

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

订阅

  • ManagementEventWatcher(斯图尔特提到的)

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

于 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 回答