IISで実行されているWebアプリが1つあり、同じマシンでホストされているWCFを介してWindowsサービスと通信します。内部的には、Windowsサービスはさまざまなジョブを実行し、ユーザー要求の処理で非常に忙しい場合があります。最初に、サービスの開始に問題がありました。これは、開始に時間がかかり、最終的にエラー、つまりサービスタイムアウトがスローされるためです。これを修正するために、コードをメインスレッドではなく別のスレッドに移動しました。すべて正常に動作しますが、ServiceStopでエラーが発生することがあります。
**1053 windows service did not respond in timely fashion**
私のサービスOnStop()コード:
protected override void OnStop()
{
// Stop the WCF service
if (myServiceHost != null)
{
myServiceHost.Close();
myServiceHost = null;
}
// Stop the scheduler
if (myScheduleManager != null)
{
myScheduleManager.Stop();
}
// Update the registry value
Logger.GetInstance().LogEvent(this.GetType().Name, LogLevel.INFO, "Updating registry...");
Settings.GetInstance().LastStopTime = DateTime.Now.ToString();
Logger.GetInstance().LogEvent(this.GetType().Name, LogLevel.INFO, "Service stopped.");
}
これは通常、サービスがビジー状態のときに発生します。しかし、最終的には30〜40分後に停止します。これは、Windowsサービスのタイムアウトの問題が原因で発生することを知っています。デフォルトの時間は非常に短く、タイムアウトとして扱われます。
このようなボトルネックを回避するためのベストプラクティスは何であるかという私の質問は、Stop関連のタスクを別のスレッドの下に移動し、非同期呼び出しを実行してそのスレッドのリソースを解放することを意味します。しかし、リソースのリリース中にユーザーがサービスを開始するとどうなりますか?