2

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関連のタスクを別のスレッドの下に移動し、非同期呼び出しを実行してそのスレッドのリソースを解放することを意味します。しかし、リソースのリリース中にユーザーがサービスを開始するとどうなりますか?

4

3 に答える 3

2

推測ですが、役立つ場合があります。ソリューション構成をデバッグではなくリリースに設定していることを確認してください。

于 2014-02-23T13:55:51.757 に答える
1

簡単なアプローチは、おそらくあなたがブール型を構築するために識別し、OnStop()中に決定することができIsRunningますmyScheduleManager

if (myScheduleManager.IsRunning)
    myScheduleManager.Stop();

ただし、30秒を超える可能性のあるプロセスを終了するさまざまなスレッドがありますが、適用することでプロセスを中止することもできます。

if (myScheduleManager.IsRunning && !_workerThread.Join(TimeSpan.FromSeconds(30))
    _workerThread.Abort 

myScheduleManager.Stop();

ただし、完全なコードスニペットが表示されなかったため、シナリオを推測します。

于 2013-03-11T13:52:04.053 に答える
1

推測するだけですが、おそらく問題を追跡するのに役立ちます。

これmyScheduleManager.Stop()は、(おそらく)プロセスが終了するのを待つものです。これは素晴らしいことですが、Windowsでは実行に30秒しか与えられませんServiceBase.OnStop()

ここで非同期処理を行っている場合は、.NET-FrameworkのCancellationTokensを使用してCancellationPatternを実装できます。

于 2013-03-11T13:38:16.760 に答える