我正在重构我的Windows服务,以便在工作线程的方法中集中访问指定的Mutex
。现在应该在finally块中释放它,而不是在OnStop()
和~DerivedService()
中释放它。
当我按Shift + F5停止调试并且预期崩溃(比礼貌地引发异常更严重)是我跳过的唯一理由时,我观察到跳过了析构函数的调用最后阻止。
当我正在编写服务和的工作线程时,我希望在更换服务代码,登录和注销,附加调试器等之前清除任何令人讨厌的意外。
感谢。
答案 0 :(得分:2)
Windows Mutexes中有一个内置机制来处理程序或线程意外终止的情况,而不释放互斥锁。如果当前持有互斥锁的线程退出,则互斥锁将自动解锁,但处于特殊的放弃状态。
不是过多地关注清理,而是在获取互斥锁并放弃其状态时进行特殊程序。在这种情况下,您可能应该对受保护资源进行一些额外的一致性检查 - 它可能保留在任何状态。
答案 1 :(得分:1)
有很多(实际上是几个)无法执行最终块的原因。一般情况下,如果您致电Environment.FailFast,则会出现一些异步异常(StackOverflowException
,ExecutingEngineException
),严重关闭您的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?