2

私は.NETの初心者です。

マルチスレッドを実行しているWindowsサービスアプリケーションについて質問があります。私の質問は、アプリケーションをWindowsサービスに登録しようとすると、サービスウィンドウの「開始中」にサービスステータスが表示されることです。私がやろうとしていることを示すために、数行のコードを含めました。

protected override void OnStart(string [] args) {
    timer = Timer(5000);
    timer.Elapsed += new ElapsedEventHandler(OnElapsedTime); 
    timer.Start();

    // when I commented out Application.Run() it runs perfect.
    Application.Run(); // run until all the threads finished working
    //todo
}

private void OnElapsedTime(object s, ElapsedEventArgs e) {
    SmartThreadPool smartThreadPool = new SmartThreadPool();

    while( i < numOfRecords){
         smartThreadPool.QueueWorkItem(DoWork);
         //.....
    }
}

さらに詳しい情報が必要な場合はお知らせください。

4

1 に答える 1

2

Application.Run()使用したコンテキストでは、同じアプリケーション コンテキストでサービス自体を再度実行するように指示するだけです。Windows サービスの一部として、アプリケーション コンテキストは既にServiceBase. これはサービスであるため、それを必要とするメソッド、ハンドルされない例外、または外部コマンドのいずれかによって停止するように指示されるまで停止しません。

スレッドの実行中に停止が発生しないようにすることを懸念している場合は、プロセスが動作していることを示す何らかのグローバル ロックが必要です。のスコープを上げるのと同じくらい簡単かもしれませんSmartThreadPool

private SmartThreadPool _pool = null;
private SmartThreadPool Pool 
{
    get
    {
        if (_pool == null)
            _pool = new SmartThreadPool();
        return _pool;
    }
}

protected override void OnStop()
{
   if (Pool != null)
   {
       // Forces all threads to finish and 
       // achieve an idle state before 
       // shutting down
       Pool.WaitForIdle();
       Pool.Shutdown();
   }
}
于 2012-10-11T16:55:20.290 に答える