0

services.mscで再起動をクリックすると、古いインスタンスがまだ完了していないときにサービスの新しいインスタンスが開始されるため、単一のインスタンスにしたいサービスがあります(いくつかのアクションを実行する必要があるため)。

サービスを終了するコードは次のようになります。

protected override void OnStop()
{
    Log.Info("STOPPING SERVICE");

    //Wait working threads to finish
    _Worker.Die();

    //Kill inner processes still running (sometimes some processes hang up and is the only way to kill them...
    ProcessUtility.KillTree(System.Diagnostics.Process.GetCurrentProcess().Id);

    //Call parent's class Stop
    base.OnStop();
}

このクラスは ServiceBase のサブクラスです。

古いインスタンスが終了したときにのみ新しいインスタンスを開始するにはどうすればよいですか?

thx スタックパワーフラワーズ!!

4

2 に答える 2

1

ちなみに、Workerのタイプはわかりませんが、通常、スレッドが呼び出しを終了するのを待っているときはですjoin()。メインスレッドが実際にワーカースレッドの終了を待機していることを確認することをお勧めします。

2つの問題、まず、サービスが適切に終了しない理由を理解する必要があります。理解したら、ミューテックスを使用して追加のインスタンスが実行されないようにすることができます。実装はここで説明されています。私がGoogleで見つけた記事で、JonSkeetも参照しています。あの男はいたるところにいます!

http://www.ai.uga.edu/~mc/SingleInstance.html

于 2009-07-03T17:19:26.960 に答える
0

Mutexクラスを見てください。これにより、プロセス間で機能するロックのような同期プリミティブを作成できます。

名前を取るこのコンストラクタを試してください。たとえば、OnStart で "MYSERVICENAME" という名前のミューテックスを作成します。OnStop でリリースします。後のサービスの OnStart は、以前のサービスの OnStop がそれを解放するまでミューテックスを超えて継続しません。

于 2009-07-03T20:46:57.420 に答える