1

接続タイムアウトは、web.config ファイルの connectionString で次のように指定されます。

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

時間は秒単位です。接続タイムアウトをミリ秒単位、たとえば 500ms で指定したい。どうやってやるの?

編集 1:データベースに到達可能かどうかを確認するだけの ping メソッドを作成するために、これを実行したいと考えています。

編集 2:私はいくつかの同様の解決策を探していましたが、この回答ではタイムアウトをミリ秒単位で指定することに言及しています。だから私は興味をそそられ、それがどのように行われるかを知りたいと思いました.

4

1 に答える 1

4

まず、プールされていない接続を使用していることを確認して、常に新しい接続を取得していることを確認して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 では、タスク内でスローされたすべての例外を監視する必要があることに注意してください。そうしないと、プログラムがクラッシュします。boolTask

4.0 より前のバージョンの .Net の例が必要な場合は、お知らせください。

于 2013-05-13T22:30:25.960 に答える