我有一个WPF应用程序。 我已经实现了以下功能,但是没有人能够捕获所有类型的应用程序出口。
public partial class App : Application
{
protected override void OnExit(ExitEventArgs e)
{}
private void Application_Exit(object sender, ExitEventArgs e)
{}
private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{}
private void Application_SessionEnding(object sender, SessionEndingCancelEventArgs e)
{}
}
例如,当强制关闭(杀死)应用程序时,上述方法都不会触发。 每次应用程序关闭时,我都需要解锁数据库中某些在应用程序运行期间被用户锁定的对象。
答案 0 :(得分:4)
您无法捕获所有类型的存在,除非您正在运行一个观察者,与您正在调查的应用程序(“目标”应用程序)分开。
原因是您无法在内部捕获应用程序崩溃(duh),强制进程终止(内部和外部)或任何相应的事情。
你所做的一切都非常好。
如果您确实希望实现单独的观察者应用程序,则可以使用.NET Process.Exited
事件,当事件因任何原因(包括应用程序崩溃)存在时会触发该事件。
另外,正如@Christian指出的那样,不应该尝试使用全能解决方案,尤其是在处理关键应用程序崩溃时(这一点是主观的)。 “当你以某种方式管理[从未处理的应用程序错误中恢复]时,你通常会做错事或者至少可能得到不准确的结果(例如,在尝试从你自己的进程中调用P / Invoke创建一个minidump时)。”
答案 1 :(得分:0)
您可以将处理程序附加到AppDomain.ProcessExit事件;据我所知,这是最可靠的方式来判断您的应用程序何时退出。
如果您将应用程序移动到Silverlight,这将无法使用,但只要您保留在WPF(或任何其他“全尺寸”.NET框架应用程序)中,这应该可以解决问题。