当连接到Server时,我的程序执行挂起的.Open()方法超过指定的2秒超时时间。
当数据库处于脱机状态或重新启动时,我设法重现了这个问题。当数据库处于运行状态的机器上时,执行程序不挂起.
当2秒超时超过时,我如何强制抛出异常或其他什么?
我试过OleDB和SqlConnection提供商,没什么不同。
我可以在连接到机器之前平平它,但是仍然有这样的情况: ping将成功(假设在机器关闭前1秒),然后打开连接挂起.
下面提供的示例代码。
public static IDbConnection GetConnection(IDbConnection connection)
{
connection.ConnectionString = "connectionString; Connection Timeout=2;";
connection.Open();
return connection;
}发布于 2016-01-18 07:54:37
Connection Timeout属性只是创建连接的时间,之后的一切(在建立连接之后还有很多事情要做)都不算,而且可能需要无限的时间(除非还有另一个我不知道的超时时间)。
您可以做的是在一个单独的线程中使用一个看门狗执行您自己的代码,以将执行的总时间限制在2秒以内。使用任务非常容易:
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;要小心,的超时时间太短:对于一个authentication,2秒总是太短了,如果您使用的是AD身份验证,那么它可能比您预期的要长。
在我看来,您必须忍受这种延迟(对于具有集成安全性的TCP连接来说,15到30秒是一个安全和合理的时间)。您还可能希望等待更长时间并重新尝试(因为错误可能是临时的,请参阅Know when to retry or fail when calling SQL Server from C#?),注意您所描述的情况(服务器正在关闭)是非常不寻常的,因此它不应该影响正常操作。如果这是您的UI的一个问题,那么您应该使您的程序并行(以保持UI响应)。
https://stackoverflow.com/questions/34849356
复制相似问题