2010-03-19 92 views
3

即使我的C#应用​​程序崩溃(删除临时文件等),我也希望在执行结束时执行一些清理代码。在C#中可以做到吗?在应用程序崩溃时执行代码

谢谢!

+1

“崩溃”是什么意思? – wtaniguchi 2010-03-19 22:59:18

+0

这就是非软件工程师所说的话:导致应用程序关闭的任何事件(任何线程中未处理的异常,除以0,访问冲突,来自我的工作者DLL的C++ SEH等等)。 – Warpin 2010-03-19 23:08:12

回答

0

这取决于你的意思是“崩溃”。如果你的意思是一个未处理的异常,你可以为Application.ThreadException创建一个处理程序。如果崩溃是在托管代码之外引起的,那么您就无能为力。

+0

我希望得到的是某种可重写的“Terminate”函数,我可以编写这个函数,这个函数被调用了未处理的异常,访问冲突或其他任何可以取消我的应用程序。大部分工作都是由C++ DLL完成的,所以处理异常也很好。 – Warpin 2010-03-19 23:06:10

-3

这就是try {} finally {}的用途。将所有的代码包裹在你的main方法中,应该这样做。

+4

在简单场景中,这可能已经足够好了,但多线程应用程序又如何呢? – 2010-03-19 23:16:05

8

这取决于你的意思是“崩溃”。

如果您想要处理任何会导致应用程序无法处理的未处理异常,则可以将事件处理程序附加到AppDomain.UnhandledException事件,然后处理事件处理程序中的任何错误。

此外,在.Net 4.0中有一个AppDomain.FirstChanceException,在发生异常时执行任何catch块之前调用。

但是,可能会发生真正的崩溃(例如从终结器抛出的异常),导致无法轻易处理的致命应用程序退出,但在大多数情况下,AppDomain.UnhandledException事件可能就足够了。

+0

我想在任何崩溃之前调用方法。 AppDomain.FirstChanceException帮助了我。谢谢! – 2018-01-18 08:21:20

2

有几个事件可以通过订阅来获得异常通知。

另外,正如其他人所提到的,围绕单个入口点的finally块将在主线程中遇到任何异常。

[我不建议尝试从这些处理程序中恢复您的应用程序。特别是在AppDomain.UnhandledException事件的情况下,你的应用程序已经出来了,你应该让它关闭。只使用这些处理程序进行最后一分钟的清理或日志记录。]

5

如果您的应用程序崩溃,那么尝试执行清理代码并不安全,您不知道什么已损坏,直到您的应用程序实际退出,文件可能被锁定等。

所以我建议你把这个清理代码放在应用程序启动。让您的应用程序在启动之前查找临时文件等,然后才能创建正常的临时文件(如果它找到它们),那么它可以删除它们或尝试修复/重新使用它们。

为了实现这一点,您可以让应用程序写入一个临时文件的日志,它创建并删除该日志文件,当它关闭成功。这样,当你在启动时发现日志文件时,你知道最后一次运行是崩溃,并且你必须进行清理。

当然,如果允许应用程序的多个实例同时运行,这会变得更加复杂,但同样适用于在崩溃时进行清理。

1

如果您的应用程序清理至关重要,则可以创建一个监视器应用程序,该应用程序将是用户实际启动的应用程序。它会启动你的主应用程序,然后监视它的进程句柄。如果你的主应用程序崩溃,它的进程句柄将发出信号,你的显示器应用程序可以清理,甚至如果你愿意重新启动主应用程序。我通常将它与一个已命名的互斥锁结合使用,该互斥锁用于向监视器应用程序发回主应用程序希望关闭的信号,以便它不会重新启动它。

相关问题