IDbConnection Open挂起C#

时间:2016-01-18 07:33:15

标签: c# .net sql-server

连接到SQL-Server时,我的程序执行挂起.Open()方法超过指定的2秒超时。

当数据库所在的计算机处于脱机或重新启动状态时,我设法重现了该问题。当数据库所在的机器启动程序的执行时会挂起。

如果2秒超时超过,我怎么强制抛出异常?

我尝试过OleDB和SqlConnection提供程序,没有区别。

我可以在连接之前对机器进行ping操作,但仍然存在ping成功的情况(让我们说机器关机前1秒)然后打开连接挂起......

下面提供的示例代码。

.on('click', function(d) {
  console.log(d, me);
  return d;
})

1 个答案:

答案 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响应)。