即使在外部终止时,也为WPF应用程序提供清理其资源的机会

时间:2016-08-24 17:38:37

标签: c# wpf dispose

目前我正在使用由另一个进程启动的WPF应用程序,并且可以随时由该其他进程终止。

它目前驱动的数据采集USB设备由于设备断开连接而处于无响应状态。

我想知道在终止之前有机会释放硬件资源的适当方式是什么。

  1. 是否有一个始终由Application实例运行的事件?
  2. 我是否可以创建一个比应用程序实例更长的帖子并发送device.Disconnect()消息?

1 个答案:

答案 0 :(得分:2)

听起来你的主要问题是USB设备有问题。任何时候任何事情都可能发生在Windows进程中;设备需要能够处理这个问题。如果与之交互的进程消失,则设备需要能够识别并处理它。我不知道具体细节(不是我自己的驱动程序作者),但有很多USB设备不仅仅因为正在使用它的程序被强制终止而停止工作。

那就是说,这让我想到了第二个问题:从你的描述来看,似乎“其他过程”强行终止你的程序。为什么?有一些更优雅的方法可以让程序退出。至少,只需发送WM_CLOSE主窗口,就像用户点击“关闭”按钮一样,按 Alt + F4 等。更好的是,提供某种类型的进程间通信(例如命名管道),以允许父进程向您的程序提供特定命令,包括关闭的命令。

如果您的流程被强行终止,那么您无法对此进行任何操作,而不是在该流程中。您无法运行任何关闭代码,也无法创建特殊线程,即使在进程被终止后也会继续运行。

一种选择是编写另一个程序,一个监视程序状态的“监视程序”。如果程序终止,则看门狗可以清理USB设备。但那不是灵丹妙药;有人也可以杀死看门狗进程,并让你回到你开始的地方。

但是如果你可以安排事情,以便在其他进程和你的进程之间进行最少量的合作,那么你可以利用通常的机制,例如Application.Exit事件或窗口{{3 }或Closing事件。