首先,请确保您使用的是非池连接以确保您始终获得新的连接,您可以通过添加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 之前版本的示例,请告诉我。