连接到SQL-Server时,我的程序执行挂起.Open()方法超过指定的2秒超时。
当数据库所在的计算机处于脱机或重新启动状态时,我设法重现了该问题。当数据库所在的机器启动程序的执行时会挂起。
如果2秒超时超过,我怎么强制抛出异常?
我尝试过OleDB和SqlConnection提供程序,没有区别。
我可以在连接之前对机器进行ping操作,但仍然存在ping成功的情况(让我们说机器关机前1秒)然后打开连接挂起......
下面提供的示例代码。
.on('click', function(d) {
console.log(d, me);
return d;
})
答案 0 :(得分:2)
Connection Timeout
属性只是创建连接的时间,之后的所有内容(建立连接后还有很多事情要做)不计算并且可能需要无限期地(除非另一个超时我不知道)。
您可以做的是在具有监视程序的单独线程中执行您自己的代码,以将总执行时间限制为两秒。使用任务非常简单:
const int HardConnectionTimeoutInMilliseconds = 2000;
if (!Task.Run(() => connection.Open()).Wait(HardConnectionTimeoutInMilliseconds))
return null; // Timeout!
为了完整起见,这是旧式代码:
Thread worker = new Thread(delegate()
{
connection.Open();
});
worker.Start();
if (!worker.Join(TimeSpan.FromSeconds(2)))
return null;
小心如此短暂的超时:对于TCP连接,两秒钟总是太短时间,如果您使用AD进行Windows身份验证,则可能需要比预期更长的时间。
在我看来,你必须生活这个延迟(15到30秒是TCP连接与集成安全性的安全合理的时间)。您可能还需要等待更多并重试(因为错误可能是暂时的,请参阅Know when to retry or fail when calling SQL Server from C#?),请注意您描述的情况(服务器正在关闭)非常不寻常IMO它不应该影响正常运作。如果您的UI出现问题,那么您应该使您的程序保持平行(以保持UI响应)。