【发布时间】: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