1

だから私はc#で書かれたWindowsサービスを持っています。サービスクラスは、から派生しServiceBase、サービスの開始と停止はそれぞれインスタンスメソッドOnStartを呼び出しますOnStop。クラスのSSCEは次のとおりです。

partial class CometService : ServiceBase
{
    private Server<Bla> server;
    private ManualResetEvent mre;
    public CometService()
    {
        InitializeComponent();
    }       
    protected override void OnStart(string[] args)
    {
        //starting the server takes a while, but we need to complete quickly
        //here so let's spin off a thread so we can return pronto.
        new Thread(() =>
        {
            try
            {
                server = new Server<Bla>();
            }
            finally
            {
                mre.Set()
            }
        })
        {
            IsBackground = false
        }.Start();
    }

    protected override void OnStop()
    {
        //ensure start logic is completed before continuing
        mre.WaitOne();
        server.Stop();
    }
}

ご覧のとおり、を呼び出すときに、を呼び出したときOnStopと同じインスタンスを処理する必要があるロジックがかなりあります。ServiceBaseOnStart

これが事実であると確信できますか?

4

2 に答える 2

2

クラスを見るとProgram.cs、次のようなコードが表示されます。

private static void Main()
{
    ServiceBase.Run(new ServiceBase[]
                {
                    new CometService()
                });
}

つまり、インスタンスは独自のプロジェクト内のコードによって作成されます。これは、すべてのService Manager呼び出し(OnStartおよびを含むOnStop)が行われる1つのインスタンスです。

于 2012-05-29T13:44:30.980 に答える
1

同じ例だと思います。クラスに静的フィールドを追加してクイックテストを実行し、OnStartで使用されるオブジェクトへの参照を追跡し、それをOnStopのインスタンスと比較できます。

private static CometService instance = null;

protected override void OnStart(...)
{
    instance = this;
    ...
}

protected override void OnStop()
{
    object.ReferenceEquals(this, instance);
    ...
}
于 2012-05-29T13:22:47.307 に答える