C# I';我在使用系统时仍然收到空异常。管理层可以';我不明白为什么

C# I';我在使用系统时仍然收到空异常。管理层可以';我不明白为什么,c#,.net,winforms,C#,.net,Winforms,这个异常并不是每次我试图让它再次发生时都会发生,只是在我一次又一次点击按钮启动观察器后,就像连续4-5次一样。。。然后关闭我的程序,出现异常 这是一个新的类,我正在使用管理。只有在我在新类中启动了watcher之后关闭程序时才会发生: 我试着试着接球,但没有一个停下来 using System; using System.Collections.Generic; using System.Text; using System.Management; using System.Diagnostic

这个异常并不是每次我试图让它再次发生时都会发生,只是在我一次又一次点击按钮启动观察器后,就像连续4-5次一样。。。然后关闭我的程序,出现异常

这是一个新的类,我正在使用管理。只有在我在新类中启动了watcher之后关闭程序时才会发生:

我试着试着接球,但没有一个停下来

using System;
using System.Collections.Generic;
using System.Text;
using System.Management;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace MinimizeCapture
{

    class WatchForWindow
    {
        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        private const int SW_SHOWNORMAL = 1;
        private const int SW_SHOWMINIMIZED = 2;
        private const int SW_SHOWMAXIMIZED = 3;

        private static ManagementEventWatcher watcher = null;

        public static void StartWatching()
        {
            try
            {
                WqlEventQuery query = new WqlEventQuery("Select * From __InstanceCreationEvent Within 2 Where TargetInstance Isa 'Win32_Process'");
                watcher = new ManagementEventWatcher(query);
                watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
                watcher.Start();
            }
            catch (Exception err)
            {
                string t = "err " + err.ToString();
            }
        }

        public static void StopWatching()
        {
            try
            {
                if (watcher != null)
                {
                    watcher.Stop();
                }
            }
            catch (Exception err)
            {
                string t = "err " + err.ToString();
            }
        }

        private static void watcher_EventArrived(object sender, EventArrivedEventArgs e)
        {
            try
            {
                ManagementBaseObject obj = (ManagementBaseObject)e.NewEvent["TargetInstance"];
                string t = obj["Name"].ToString();
                GetHWND(t);
            }
            catch (Exception err)
            {
                string t = "err " + err.ToString();
            }
        }

        private static void GetHWND(string wName)
        {
            try
            {
                IntPtr hWnd = FindWindow("Chrome_WidgetWin_1 for Chrome", "Untitled - Notepad");
            }
            catch (Exception err)
            {
                string t = "err " + err.ToString();
            }
        }
    }
}
这是我在这门课上唯一使用system.management的地方 昨天,我确信问题是当我关闭程序时,我需要关闭watcher,所以我在类中添加了一个名为StopWatching的方法

在表格1中,我是如何在课堂上启动观察者的:

private void buttonSnap_Click(object sender, EventArgs e)
        {
            WatchForWindow.StartWatching();
        }
我就是这样阻止它的:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            WatchForWindow.StopWatching();
        }
这是异常消息:

System.NullReferenceException was unhandled
  Message=Object reference not set to an instance of an object.
  Source=System.Management
  StackTrace:
       at System.Management.IWbemServices.CancelAsyncCall_(IWbemObjectSink pSink)
       at System.Management.SinkForEventQuery.Cancel()
       at System.Management.ManagementEventWatcher.Stop()
       at System.Management.ManagementEventWatcher.Finalize()
  InnerException: 
这是我得到的带有异常消息的窗口:

System.NullReferenceException was unhandled
  Message=Object reference not set to an instance of an object.
  Source=System.Management
  StackTrace:
       at System.Management.IWbemServices.CancelAsyncCall_(IWbemObjectSink pSink)
       at System.Management.SinkForEventQuery.Cancel()
       at System.Management.ManagementEventWatcher.Stop()
       at System.Management.ManagementEventWatcher.Finalize()
  InnerException: 

我还不知道什么东西有时会变空?为什么?以及如何解决这个问题

    public static void StartWatching()
    {
        StopWatching(); //add this line
        try
        {
            WqlEventQuery query = new WqlEventQuery("Select * From __InstanceCreationEvent Within 2 Where TargetInstance Isa 'Win32_Process'");
            watcher = new ManagementEventWatcher(query);
            watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
            watcher.Start();
        }
        catch (Exception err)
        {
            string t = "err " + err.ToString();
        }
    }

出现问题的原因是您创建了多个EventWatcher,而没有清理旧的EventWatcher。如果您进行我建议的单行更改,您应该不会再有问题。

您将无法轻松捕获此异常,因为它发生在ManagementEventWatcher的终结器中。在删除对对象的所有引用后,.NET垃圾收集器将调用此方法。您可以通过始终确保退出前已停止观察程序来避免此问题。出现此问题的原因是您没有干净地处理观察程序。在StartWatching()中,只需在第一行调用StopWatching()。