1

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

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

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

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

编辑2:我一直在寻找一些类似的解决方案,这个答案提到以毫秒为单位指定超时。所以我很感兴趣,想知道如何做到这一点。

4

1 回答 1

4

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

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

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

当此超时时,您应该会看到go to cancelled 状态Task返回OpenAsync,这将导致TaskCanceledException

对于.Net 4.0,您可以将打开的连接包装在 a 中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 中,您必须观察任务中抛出的所有异常,否则它们会导致您的程序崩溃。

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

于 2013-05-13T22:30:25.960 回答