まず、プールされていない接続を使用していることを確認して、常に新しい接続を取得していることを確認してPooling=false
ください。接続文字列に追加することでこれを行うことができます。これらのソリューションの両方について、Connection Timeout=1
アプリケーションがあきらめた後も ADO.NET が不必要に接続を開き続けないようにするためだけに追加することをお勧めします。
.Net 4.5 の場合、新しいOpenAsync
メソッドと aCancellationToken
を使用して短いタイムアウト (500ms など) を実現できます。
using (var tokenSource = new CancellationTokenSource())
using (var connection = new SqlConnection(connectionString))
{
tokenSource.CancelAfter(500);
await connection.OpenAsync(tokenSource.Token);
}
Task
これがタイムアウトすると、 goによって返され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()
を返します。.Net 4.0 では、タスク内でスローされたすべての例外を監視する必要があることに注意してください。そうしないと、プログラムがクラッシュします。bool
Task
4.0 より前のバージョンの .Net の例が必要な場合は、お知らせください。