【问题标题】:C# App using Windows API Code Pack Shell Extension won't shut down使用 Windows API Code Pack Shell 扩展的 C# 应用程序不会关闭
【发布时间】:2012-02-15 10:48:15
【问题描述】:

我有一个使用 Microsoft Windows API 代码包的 C# 应用程序 - 特别是我用来监控存储设备和媒体插入和移除的 Shell 扩展。

但是,当我尝试在 Visual C# 2010 (Express) 中关闭应用程序时,我必须手动停止调试器。即使我手动处理了 ShellObjectWatcher,Win API 代码包中似乎仍有一个后台循环仍在运行。我可以杀死它的唯一方法是手动停止调试器。

该应用是在 WPF 中构建的。

最终,VisC#2010 放弃了尝试在调试器下运行应用程序。你告诉它开始调试,它只是没有。让它再次运行的唯一方法是使用任务管理器终止应用程序,然后关闭 VC#2010 - 去喝杯咖啡 - 然后重新启动它。奇怪的。我怀疑有一个隐藏的进程或窗口在我尝试清理应用程序时没有被关闭。

知道如何更有效地清理这个 ShellObjectWatcher 吗?

【问题讨论】:

  • 我没有看到“ShellObjectWatcher”类,什么版本? Shell 接口总是具有 COM 线程关联性,请确保仅从 WPF 或 Winforms 应用程序中的 [STAThread] 使用它们。如果你不这样做,那么 COM 将启动一个线程来为对象提供一个线程安全的家。
  • 它是 Windows API Code Pack 1.1 的一部分,它似乎挂在代码包内的 messagelistener 线程方法上。
  • 我也遇到了这个问题。具体来说,MessageListener.ThreadMethod() 在 while(_running) 内有一个阻塞调用,因此如果 Dispose() 试图通过设置 _running 来结束线程,它不会响应。当然,事实并非如此。所以这些 MessageListener 线程永远不会被清理。如果它是一个后台线程,这会很好,但它不是。您可以在 MSFT 自己的 ShellObjectWatcherSampleWPF 上看到相同的行为。

标签: c# shell-extensions


【解决方案1】:

要修复 Code Pack Shell 项目中的 bug,请在 MessageListener.WndProc() 中添加一行:

case (uint)WindowMessage.Destr​oy:
 **_running = false;**
 break;

现在ThreadMethod() 将退出消息循环。

【讨论】:

    【解决方案2】:

    使用System.Environment.Exit(0); 确定可以解决此问题。应用程序关闭,调试器释放控制权。蛮力在这种情况下起作用。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,但是通过将线程设置为后台线程来解决它(意思是,当应用程序停止时它被杀死):

      MessageListener.cs 的构造函数中,第 40 行,我有:

      _windowThread = new Thread(ThreadMethod);
      // The line below will force the thread to terminate when the app exits.
      _windowThread.IsBackground = true;
      _windowThread.SetApartmentState(ApartmentState.STA);
      

      【讨论】:

        猜你喜欢
        • 2011-01-12
        • 1970-01-01
        • 2011-03-06
        • 1970-01-01
        • 2021-04-14
        • 1970-01-01
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多