为 WPF 应用程序提供清理其资源的机会,即使在外部终止时也是如此
Giving a WPF Application the opportunity to cleanup its resources even when terminated externally
目前我正在使用由另一个进程启动的 WPF 应用程序,并且可以随时由该其他进程终止。
它目前驱动一个数据采集 usb 设备,该设备由于不正确的设备断开连接而处于无响应状态。
我想知道在被终止之前有机会释放硬件资源的适当方式是什么。
- 是否有应用程序实例始终运行的事件?
- 我是否可以创建一个比 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
事件。
目前我正在使用由另一个进程启动的 WPF 应用程序,并且可以随时由该其他进程终止。
它目前驱动一个数据采集 usb 设备,该设备由于不正确的设备断开连接而处于无响应状态。
我想知道在被终止之前有机会释放硬件资源的适当方式是什么。
- 是否有应用程序实例始终运行的事件?
- 我是否可以创建一个比 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
事件。