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

Giving a WPF Application the opportunity to cleanup its resources even when terminated externally

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

它目前驱动一个数据采集 usb 设备,该设备由于不正确的设备断开连接而处于无响应状态。

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

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

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

也就是说,这让我想到了第二个问题:根据您的描述,"other process" 似乎正在强制终止您的程序。为什么?有更优雅的方式让程序退出。至少,只需将 WM_CLOSE 发送到主 window,就像用户单击 "Close" 按钮一样,按下 Alt+F4 等。更好的是,提供某种类型的进程间通信(例如命名管道)以允许父进程给出特定的命令,包括一个关闭,到你的程序。

如果您的进程被强制终止,您将无能为力,无论如何都不能从该进程中进行。您不会获得 运行 任何关闭代码,也无法创建即使在进程被终止后仍继续运行的特殊线程。

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

但是,如果您可以安排其他进程与您的进程之间进行最少的合作,那么您就可以利用通常的机制,例如 Application.Exit event or a window's Closing or Closed 事件。