0

SQL Server 接続で問題が発生するたびに (サーバーの切り替えなど)、アプリケーションのメッセージ ボックスに例外メッセージが表示されます。接続を開こうとしている/クエリを実行しようとしている場合を除いて、いつ接続が利用可能になるかわかりません。

そのため、接続が利用できない場合に表示される待機フォームを作成し、接続を開こうとし続け、接続が再び利用可能になったときにそれ自体を閉じます。

フリーズをユーザーから隠すために、バックグラウンド ワーカーを使用します。

これはバックグラウンド ワーカー コードです。

    private void StartLoader(object sender, DoWorkEventArgs e)
    {
        for (int i = 1; i <= 10; i++)
        {
            if (this.par.sqSuccess) //if no error, means connection is available, stop looping
            {
                break;
            }
            else
            {
                i -= 1;
            }

            System.Threading.Thread.Sleep(5000); //report progress every 5 second
        }

これは、バックグラウンド ワーカーの進行状況変更イベントです。

this.cnn = new SqlConnection(this.par.Constr);

try
{
   this.cnn.Open(); //SqlConnection

   this.par.sqSuccess = true; //if no error, then I change this variable
}
catch (Exception ex)
{
   this.par.Exception = ex.Message;
}
finally
{
   if (this.cnn != null) { this.cnn.Dispose(); }
}
if (this.par.sqSuccess) { this.Close(); }

すべてが完了した後、SQL Server サービスを から停止してからservices.msc、接続を試みました。

待機フォームが表示され、その仕事を続けます。

接続を試みてから数秒後、サービスを再度開始すると、待機フォームが閉じて成功しました。これが問題です。サービスを再開する前にもう少し待つと、待機フォームは閉じたままですが、しばらく時間がかかります。

すべてを確認したところ、cnn.open()待ち行列ができているようで、サービスを停止する時間が長くなるほど、待機フォームが閉じるまでに時間がかかります。

Google を検索し、Connect Timeout=3; を追加しようとしました。私のthread.sleep(5000)はそれらをキューに入れませんが、それでも機能しないと確信しているため、接続文字列の背後にあります。

誰かが私に使うように言ったcnn.OpenAsync();

に関するドキュメントを読んだ後OpenAsync、これが私がすることです。

    static async Task<ConnectionState> Method(SqlConnection cnn)
    {
        await cnn.OpenAsync();
        return cnn.State;
    }

この

    private void SQLClientLoader_Load(object sender, EventArgs e)
    {
        do
        {
            this.cnn = new SqlConnection(this.par.Constr);

            try
            {
                ConnectionState cst = Method(cnn).Result;

                if (cst == ConnectionState.Open)
                {
                    this.par.sqSuccess = true;
                }
                else
                {

                }
            }
            catch (Exception ex)
            {
                this.par.sqSuccess = false;

                this.par.Exception = ex.Message;
            }
            finally
            {

            }
        } while ((bool)this.par.sqSuccess != true);
    }

上記のコードは、フォーム ロード コードが実行されるたびにアプリケーションをフリーズします。

プロセスが完了するのを待つ方法、cnn.Openまたは時間がかかりすぎる場合はプロセスをキャンセルする方法について、簡単な指示が必要です。

前もって感謝します

4

1 に答える 1

0

コードまたは ConnectionString で SqlConnection の ConnectionTimeout プロパティを設定できます。非同期IMHOを使用する必要はありません..

cnn.ConnectionTimeout = 5000

そのため、接続が機能しない場合 (connectiontimeout + Sleep(5000))、約 10 秒の遅延が発生します。

于 2013-09-12T17:22:42.113 に答える