c# - IDbConnection Open 挂起 C#

标签 c# .net sql-server

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

当数据库所在的机器离线或重新启动时,我设法重现了这个问题。当数据库所在的机器启动时,程序的执行将取消挂起。

当超过 2 秒超时时,我如何强制抛出异常或其他什么?

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

我可以在连接到机器之前 ping 机器,但仍然存在 ping 成功的情况(假设机器关闭前 1 秒),然后打开连接挂起...

下面提供了示例代码。

public static IDbConnection GetConnection(IDbConnection connection)
{
    connection.ConnectionString = "connectionString; Connection Timeout=2;";
    connection.Open();
    return connection;
}

最佳答案

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 身份验证,那么它可能需要比您预期更长的时间。

在我看来,您必须忍受这种延迟(对于具有集成安全性的 TCP 连接,15 到 30 秒是安全合理的时间)。您可能还想等待更多时间并重试(因为错误可能是暂时的,请参阅 Know when to retry or fail when calling SQL Server from C#? ),请注意您所描述的情况(服务器正在关闭)非常不寻常,然后 IMO 它应该'不影响正常操作。如果这对您的 UI 来说是一个问题,那么您应该使您的程序并行(以保持 UI 响应)。

关于c# - IDbConnection Open 挂起 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34849356/

相关文章:

c# - 返回分层 xml 的节点级别

c# - .NET 是否为 DispId 预定义了常量值?

sql-server - SQL Server 2008R2 中 "SET STATISTICS TIME ON"的奇怪副作用?

sql-server - Hibernate/JPA 和 MS SQL Server - 在 DecryptByKey 之前打开对称 key

C# 查找列表是否包含重复 5 次的项目

c# - 如何在数据库中保存全局捕获的异常

c# - 如何在 WPF 中随 TextBox 的大小缩放文本的大小?

c# - 如何从 sql 多个表(具有外键的相关表)生成 c# 类

c# - 在 DrawingContext 上绘制时在图像上绘制阴影

c# - 在 C# 中伪造 TCP 请求