如何指定不到一秒的ADO.NET连接超时?

时间:2012-11-06 12:24:47

标签: ado.net sqlconnection

连接超时在web.config文件的connectionString中指定,如下所示:

"Data Source=dbs;Initial Catalog=db;"+"Integrated Security=SSPI;Connection Timeout=30"

时间以秒为单位。我想以毫秒为单位指定连接超时,比如说500毫秒。我怎么能这样做?

编辑1:我想这样做来创建一个ping方法,只检查数据库是否可以访问。

编辑2:我一直在寻找一些类似的解决方案,而answer提到了指定超时(以毫秒为单位)。所以我很好奇,想知道如何做到这一点。

1 个答案:

答案 0 :(得分:4)

首先,请确保您使用非池连接以确保始终获得全新连接,您可以通过在连接字符串中添加Pooling=false来实现此目的。对于这两种解决方案,我还建议添加Connection Timeout=1以确保在应用程序放弃后ADO.NET不会不必要地继续打开连接。

对于.Net 4.5,您可以使用新的OpenAsync方法和CancellationToken来实现短暂超时(例如500毫秒):

using (var tokenSource = new CancellationTokenSource())
using (var connection = new SqlConnection(connectionString))
{
    tokenSource.CancelAfter(500);
    await connection.OpenAsync(tokenSource.Token);
}

如果超时,您应该会看到Task返回的OpenAsync进入已取消状态,这将导致TaskCanceledException

对于.Net 4.0,您可以在Task中打开连接并等待所需的时间:

var openTask = Task.Factory.StartNew(() =>
{
    using (var connection = new SqlConnection(connectionString))
    {
        connection.Open();
    }
});

openTask.ContinueWith(task =>
{
    // Need to observe any exceptions here - perhaps you might log them?
    var ignored = task.Exception;
}, TaskContinuationOptions.OnlyOnFaulted);

if (!openTask.Wait(500))
{
    // Didn't complete
    Console.WriteLine("Fail");
}

在此示例中,openTask.Wait()将返回bool,表示Task是否已完成。请注意,在.Net 4.0中,您必须观察任务中抛出的所有异常,否则会导致程序崩溃。

如果您需要4.0之前版本的.Net请告诉我。