10

Windowsサービスでは、メソッド呼び出しはどのような順序で行われますか?タイミングの問題があり、コンストラクターが処理を完了するのに時間がかかりすぎることが原因だと思います。

これは、サービスが開始要求または制御要求に応答しなかったというエラー1053が発生していると思われる同様の問題です。

ただし、Main、OnStart、InitializeComponentなどのメソッドがどのような順序でいつ呼び出されるのか、および/またはいつ呼び出す必要があるのか​​疑問に思います。

同様に、OnStartメソッドは、すべての処理を行うのに最適な場所でしょうか?

**解決

テストサービスを作成し、以下の応答をテストしたところ、タイムアウトがMainメソッドの処理と、Mainメソッドで呼び出されたコンストラクターがタイムアウトの原因になっていることがわかりました。すべてをOnStartに移動するだけでなく、スレッドをスピンオフするだけでも機能するように見えました。詳細はこちら。http://www.adamthings.com/post/2012/06/28/error-1053-the-service-did-not-respond-to-the-start-or-control-request-in-a-timely-ファッション/

4

2 に答える 2

6

注文は

Mainコードを配置する場所については、にキャッシュできるコードと、各開始時にリサイクルされるコードを内部に配置することをお勧めしますOnStart。ただし、で実際の処理を行うのではなくOnStart、初期化だけを行う必要があります。別のスレッドを使用して、ロジックの大部分を実行します。

また、MSDNはこれに役立ちます

于 2012-06-28T17:50:28.100 に答える
6

OnStart()メソッドをブロックしないでください。あなたがこれをしているように聞こえます。

OnStart()メソッドに別のスレッドを作成し、そこから抜け出します。

私はこれをテストしていませんが、次のようなものです。

protected override void OnStart(string[] args)
{
    var worker = new Thread(DoWork);
    worker.IsBackground = false;
    worker.Start();

    base.OnStart(args);
}

private void DoWork()
{
    while (!_stopRequested)  // (set this flag in the OnStop() method)
    {
        // processing goes here
    }
}

イベントの順序に関する質問に答えるには、各メソッドでTraceステートメントを設定するだけです。それがどれほど役立つかわかりません。表示されるメッセージ(サービスが開始要求に応答しませんでした...)は、比較的高速に実行する必要があるメソッドでのブロック(または時間がかかりすぎる)を示しています。

于 2012-06-28T17:55:04.163 に答える