繁体   English   中英

持续监控流程

[英]Constantly monitor processes

我写了一些代码来监视正在运行的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;
            }
        }
    }
}

有任何想法吗?

这可以使用Subscription或Polling实现。

轮询 (用于过程循环)

  • 后台工作者

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

  • 线程池线程

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

  • 线程类

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

下标

  • 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类。

您可以创建这样的方法

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM