2

私のプロジェクトでは、サーバー上でいくつかのプロセスを開始するために、c# で小さな Windows サービスを作成しました。新しいサービスは MSSQLSERVER サービスに依存するようになり、ユーザー セッション内から操作すると確実に開始/実行/停止します。

ただし、起動時には、パフォーマンスが制限されたハードウェアが非常にビジーであり、MSSQLSERVER がサービス コントロール マネージャーに「開始済み」と報告していても、クエリを処理する準備ができていないようです。そのため、SQLConnection を開くと成功しますが、「時々」(約 50/50) クエリを実行しようとすると失敗します。

これに対処するための私の(確かに率直な)アプローチは、失敗していると思われる ExecuteReader メソッドを使用することでした。

rdr = cmd.ExecuteReader();

1 秒の遅延で Try/Catch に配置し、最大 10 回再試行します。

        bool bReady = false;
        int iErrCount = 0;
        while (bReady == false && iErrCount < 10)
        {
            try
            {
                System.Threading.Thread.Sleep(1000); 
                rdr = cmd.ExecuteReader();
                bReady = true;
                EventLog.WriteEntry("Starting...",EventLogEntryType.Information);
            }
            catch
            {
                bReady = false;
                iErrCount += 1;
                EventLog.WriteEntry("Failed once...",EventLogEntryType.Warning);
            }
        }

        if (bReady == false)
        {
            EventLog.WriteEntry("Failed ten times.  Service will now exit.",EventLogEntryType.Error);
            return; 
        }

私の困ったことは、このアプローチは完全に機能しており、サービスを毎回開始できるにもかかわらず、イベント ログを確認すると、実際には最初の試行で常に成功することです。キャッチしようとしている例外は発生しません。Try/Catch 自体の内部にメソッド呼び出しを配置することに関する何かが、成功の可能性に影響を与えたかのようです。

どんな考えでも大歓迎です。

4

1 に答える 1

1

以前はなかった Thread.Sleep を追加していませんか?

System.Threading.Thread.Sleep(1000); 
rdr = cmd.ExecuteReader();

それが以前になかった場合は、接続を開こうとする前に、1 秒間スリープ状態になっています。多分それはあなたが必要としていたすべてです。

于 2012-11-13T15:10:18.230 に答える