我正在重构我的 Windows 服务,以便对命名Mutex
的访问集中在工作线程的方法中。而不是释放它,OnStop()
现在~DerivedService()
应该在 finally 块中释放它。
我观察到当我按下 Shift+F5 以停止调试并期望它时跳过析构函数调用,并且崩溃(比礼貌地引发异常更严重)将是跳过 finally 块的唯一原因。
当我正在编写服务及其工作线程时,我希望在替换服务代码、登录和注销、附加调试器等的严格规定之前清除这里的任何令人讨厌的惊喜。
谢谢。
我正在重构我的 Windows 服务,以便对命名Mutex
的访问集中在工作线程的方法中。而不是释放它,OnStop()
现在~DerivedService()
应该在 finally 块中释放它。
我观察到当我按下 Shift+F5 以停止调试并期望它时跳过析构函数调用,并且崩溃(比礼貌地引发异常更严重)将是跳过 finally 块的唯一原因。
当我正在编写服务及其工作线程时,我希望在替换服务代码、登录和注销、附加调试器等的严格规定之前清除这里的任何令人讨厌的惊喜。
谢谢。
Windows 互斥体中有一个内置机制来处理程序或线程意外结束的情况,而不释放互斥体。如果当前持有互斥锁的线程退出,互斥锁将自动解锁,但处于特殊的放弃状态。
与其过多地关注清理工作,不如在获得互斥体并放弃其状态时制定一个特殊的例程。在这种情况下,您可能应该对受保护的资源进行一些额外的一致性检查 - 它可能处于任何状态。
最终块无法执行的原因有很多(实际上有几个)。一般来说,如果您调用Environment.FailFast,一些异步异常(StackOverflowException
, ExecutingEngineException
),会猛烈关闭您的 PC :-),并且(经常被遗忘)如果终结器方法中存在异常
在这里阅读示例C#“最终”块是否总是执行?在 C# 中,如果抛出未处理的异常,Finally 块是否会在 try、catch、finally 中执行?