VisualStudio调试器退出时执行代码

Coo*_*ame 14 .net c# dispose .net-4.0 finalizer

我假设在终止调试时(例如通过点击"停止"按钮,或按Shift + F5),任何实现终结器或IDisposable的类都将被处理掉.

我有一些实现IDisposable的类.当应用程序从调试器退出时(或从生产中崩溃),我想做(尝试)并执行一些操作.现在,Dispose()似乎没有被调用,也没有终结器IDisposable

有没有办法做到这一点?

Jam*_*ing 2

为了正常停止 Windows 服务,您应该将代码放在 Stop 方法中。

http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.stop.aspx

一般来说,粗鲁的线程中止和粗鲁的应用程序域卸载不会运行“正常”终结器 - 您可以在这篇 MSDN 文章中获得更多详细信息。

https://web-beta.archive.org/web/20150423173148/https://msdn.microsoft.com/en-us/magazine/cc163716.aspx

到目前为止,我只是简单地讨论了由于运行时在线程上抛出 ThreadAbortException 而导致的线程中止。通常,这将导致线程终止。但是,线程可以处理线程中止,防止其终止线程。为了解决这个问题,运行时提供了一个更强大的操作,恰当地命名为“粗鲁线程中止”。粗鲁的线程中止会导致线程停止执行。发生这种情况时,CLR 不保证线程上的任何回退代码都会运行(除非代码在 CER 中执行)。确实很粗鲁。

类似地,虽然典型的应用程序域卸载将正常中止域中的所有线程,但粗鲁的应用程序域卸载将粗鲁地中止域中的所有线程,并且不保证与该域中的对象关联的正常终结器将运行。SQL Server 2005 是一种 CLR 主机,它利用粗鲁的线程中止和粗鲁的应用程序域卸载作为其升级策略的一部分。当异步异常发生时,资源分配失败将升级为线程中止。而当发生线程中止时,如果在SQL Server设定的时间范围内没有完成,就会升级为粗鲁线程中止。同样,如果应用程序域卸载操作没有在 SQL Server 设置的时间跨度内完成,则会升级为粗鲁应用程序域卸载。(请注意,刚刚列出的策略并不完全是 SQL Server 使用的策略,因为 SQL Server 还会考虑代码是否在关键区域中执行,但稍后会详细介绍该主题)。