【问题标题】:On button end running methods in different method关于按钮结束运行方法的不同方法
【发布时间】:2015-05-03 21:28:54
【问题描述】:

所以我有一些代码可以检查插件和 USB 设备的删除。

public void Main_Shown(object sender, EventArgs e)
        {
            var watcheradd = new ManagementEventWatcher();
            var queryadd = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2");
            watcheradd.EventArrived += new EventArrivedEventHandler(watcher_deviceadded);
            watcheradd.Query = queryadd;
            watcheradd.Start();


            var watcherremove = new ManagementEventWatcher();
            var queryremove = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 3");
            watcherremove.EventArrived += new EventArrivedEventHandler(watcher_deviceremoved);
            watcherremove.Query = queryremove;
            watcherremove.Start();   
}

我想知道在我的程序退出之前我是否可以停止 watchremovewatcheradd 循环,以防止通过内的停止代码出现异常:

     private void Exit_Main(object sender, EventArgs e)
    {
        Process p = new System.Diagnostics.Process();
        ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo();
        si.RedirectStandardInput = false;
        si.CreateNoWindow = true;
        si.UseShellExecute = false;
        si.FileName = "adb.exe";
        si.Arguments = "kill-server";
        p = Process.Start(si);
        p.WaitForExit();

        Application.Exit();
        //EXIT APPLICATION!!!            
    }

Main_Shown.deviceadd.Stop(); 不是正确的语法或方法。 结果应该安全地停止上述循环,然后让程序无异常退出。

【问题讨论】:

  • 为什么 Stop 不正确?你的意思是拦截关闭应用程序事件?你能澄清一下吗?
  • 因为它在不同的方法中运行,所以它不起作用。我编辑了原始代码以反映这一点。
  • 如果要调用 Stop() 方法,那么 watcheradd 和 watcherremove 不能是局部变量。使它们成为类的字段。
  • 只是为了澄清一些事情。我会使用{} 来封装 watcheradd 和 watcherremove 然后我可以在其他地方调用它吗?或者它是否需要更多。文章链接MSDN Article

标签: c# loops managementeventwatcher


【解决方案1】:

找到了解决办法。 所以我需要添加

 ManagementEventWatcher watcheradd = new ManagementEventWatcher();
    WqlEventQuery queryadd = new WqlEventQuery();
    ManagementEventWatcher watcherremove = new ManagementEventWatcher();
    WqlEventQuery queryremove = new WqlEventQuery();

在类之上并将类设置为全局。所以现在它可以使用下面的代码毫无问题地退出。

`si.FileName = "adb.exe";
        si.Arguments = "kill-server";
        p = Process.Start(si);
        p.WaitForExit();
        watcherremove.Stop();
        watcheradd.Stop();
        Application.Exit();
        //EXIT APPLICATION!!`

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    相关资源
    最近更新 更多