在没有 Dispose 事件处理程序的情况下处理应用程序关闭事件

Posted

技术标签:

【中文标题】在没有 Dispose 事件处理程序的情况下处理应用程序关闭事件【英文标题】:Handle Application closing event without Dispose event handler 【发布时间】:2019-02-15 20:47:19 【问题描述】:

我想知道是否有一种方法可以在不使用 dispose 事件处理程序的情况下处理 Visual Studio 2008 中的关闭应用程序。

如果我的应用程序崩溃或者我在它运行时关闭它:

Private Sub Foo_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed

没有被调用。

这会导致一个严重的问题,因为我目前正在处理多个 Excel 文件,并且它们在应用程序崩溃后仍保持打开状态,或者我在它运行时将其关闭。

有没有办法处理这种关闭应用程序事件?

【问题讨论】:

如果您的应用程序由于 CLR 异常而崩溃,您可以使用AppDomain.UnhandledException event,但对于更严重的崩溃,您无能为力。但是,在您的应用程序刚刚关闭的正常情况下,您可以订阅Shutdown event。 我的意思是崩溃,没有任何例外。这一切都包含在一个 try catch 中,但有时它会无缘无故停止工作,我敢打赌是因为我正在使用非常低预算的装备和旧硬件 你试过处理:Application.​Thread​Exception Event和App​Domain.​Unhandled​Exception Event 我试试看 @VisualVincent 它说:无法找到关机事件 【参考方案1】:

在正常情况下,当您的应用程序只是关闭时,您可以订阅 MyApplication.Shutdown event 并在其中关闭您的 excel 文档。

可以通过以下步骤订阅活动:

    Solution Explorer 中右键单击您的项目,然后按Properties

    转到Application 窗格并按View Application Events

    在打开的文件中,要么自己编写事件处理程序,要么让 VS 完成,首先在文本编辑器上方的左侧组合框中选择 (MyApplication Events),然后在右侧选择 Shutdown组合框。

现在您应该有一个如下所示的事件处理程序。继续在那里进行清理:

Private Sub MyApplication_Shutdown(sender As Object, e As System.EventArgs) Handles Me.Shutdown
    'Do your cleanup here...
End Sub

对于由 CLR 异常引起的应用程序崩溃,您可以使用 AppDomain.UnhandledException event,但对于更严重的崩溃,您无能为力。

一种解决方法是创建另一个应用程序来监控您的主应用程序。当其他应用程序感知到您的主应用程序的进程已终止时,它将关闭 excel 文档。此解决方案的棘手部分是传递其他应用关闭文档所需的信息。

【讨论】:

chiky 棘手!感谢您的回答。欣赏它!附言 我要发布另一个问题,你能帮我解决新问题吗? @Simo : DOOM 是爱,DOOM 是生命 “你能帮我做一个新的吗?” - 也许,取决于它是关于什么的。 :) vb.net 中仍有一些问题

以上是关于在没有 Dispose 事件处理程序的情况下处理应用程序关闭事件的主要内容,如果未能解决你的问题,请参考以下文章

处理顺序

程序设计中关于Java 异常处理应注意的问题

处理 WPF 用户控件

窗体监听事件WindowListener

在 Form.Dispose() 方法中安全调用

讲清楚,说明白! Linux系统应急响应流程