d4n*_*4nt 5 .net multithreading
我们有一个用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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
当数据库消失后,我们将Thread.Sleep放入了几次,然后我们回到了3Gb日志文件中,这些文件充满了数据库连接错误.
这几个月一直运行良好,但最近我们已经看到一些实例,其中log.Error()语句记录了一个"System.InvalidOperationException:这个SqlTransaction已经完成;它不再可用"异常然后永远不会回来.该服务可以保持运行数天,但不会记录任何其他内容.
做过一些阅读之后,我知道Thread.Sleep并不理想,但为什么它永远不会回来?
挖掘并找出答案?把调试器贴在那个混蛋上!
我至少可以看到以下几种可能性:
也许,但几乎可以肯定不是,以下内容:
但无论如何,附加调试器将显示线程是否仍然存在以及它是否真的挂起.