私のプロジェクトでは、サーバー上でいくつかのプロセスを開始するために、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 自体の内部にメソッド呼び出しを配置することに関する何かが、成功の可能性に影響を与えたかのようです。
どんな考えでも大歓迎です。