我们有一个用C#编写的Windows服务.该服务产生一个执行此操作的线程:
private void ThreadWorkerFunction() { while(false == _stop) // stop flag set by other thread { try { openConnection(); doStuff(); closeConnection(); } catch (Exception ex) { log.Error("Something went wrong.", ex); Thread.Sleep(TimeSpan.FromMinutes(10)); } } }
当数据库消失后,我们将Thread.Sleep放入了几次,然后我们回到了3Gb日志文件中,这些文件充满了数据库连接错误.
这几个月一直运行良好,但最近我们已经看到一些实例,其中log.Error()语句记录了一个"System.InvalidOperationException:这个SqlTransaction已经完成;它不再可用"异常然后永远不会回来.该服务可以保持运行数天,但不会记录任何其他内容.
做过一些阅读之后,我知道Thread.Sleep并不理想,但为什么它永远不会回来?
挖掘并找出答案?把调试器贴在那个混蛋上!
我至少可以看到以下几种可能性:
日志系统挂起;
线程退出很好但服务仍在运行,因为其他部分有逻辑错误.
也许,但几乎可以肯定不是,以下内容:
睡觉()挂起.
但无论如何,附加调试器将显示线程是否仍然存在以及它是否真的挂起.