什么原因可能会跳过“finally”代码块?

时间:2011-10-23 18:47:25

标签: .net multithreading c++-cli finally

我正在重构我的Windows服务,以便在工作线程的方法中集中访问指定的Mutex。现在应该在finally块中释放它,而不是在OnStop()~DerivedService()中释放它。

当我按Shift + F5停止调试并且预期崩溃(比礼貌地引发异常更严重)是我跳过的唯一理由时,我观察到跳过了析构函数的调用最后阻止。

当我正在编写服务的工作线程时,我希望在更换服务代码,登录和注销,附加调试器等之前清除任何令人讨厌的意外。

感谢。

2 个答案:

答案 0 :(得分:2)

Windows Mutexes中有一个内置机制来处理程序或线程意外终止的情况,而不释放互斥锁。如果当前持有互斥锁的线程退出,则互斥锁将自动解锁,但处于特殊的放弃状态。

不是过多地关注清理,而是在获取互斥锁并放弃其状态时进行特殊程序。在这种情况下,您可能应该对受保护资源进行一些额外的一致性检查 - 它可能保留在任何状态。

答案 1 :(得分:1)

有很多(实际上是几个)无法执行最终块的原因。一般情况下,如果您致电Environment.FailFast,则会出现一些异步异常(StackOverflowExceptionExecutingEngineException),严重关闭您的PC :-),以及(经常被遗忘)if there is an exception in a finalizer method

请在此处阅读Does the C# "finally" block ALWAYS execute?In C# will the Finally block be executed in a try, catch, finally if an unhandled exception is thrown?