2012-04-25 1 views
1

無限に始まるアプリケーションを設計しましたThread。このThreadは、SOAP-APIを介して特定のデバイスからイベントを収集し、特定のイベントが発生したときにさまざまなメソッドを実行します。
これをすべてサービスとして実行したいのですが、アプリケーションの設計方法がわかりません。C#サービスエンドレススレッドを開始するアプリケーション

私の現在の計画はサービスを提供することです。そのサービスは情報を収集する "ポーラー"クラスのインスタンスを作成します。その後、常に「ポーラー」のポーリング機能を実行するスレッドが作成されます。私のサービスアプリケーションのOnStartイベントで、「ポーラー」のインスタンスとスレッドをすべて作成して実行する必要がありますか? OnStopイベントでスレッドを停止する必要がありますか?それとももっと賢いデザインがありますか?

OnStartイベントは永遠に実行するべきではないことを私は読んでいるので、これについてはわかりません。しかし、私がここからThreadと呼んでも、それは永遠に実行されますか?任意の助け

おかげで、これは「ポーラー」クラスを使用すると、いくつかの選択肢を持っているので、あなたが作成ポーリングスレッドから使​​用されようとしている

+2

あなたは自分で立ち往生し、遭遇したときに特定の問題に戻る必要があります。 – Nick

答えて

4

:-)私の最初のサービスアプリケーションであるとして。おそらく、ポーラークラスctorにポーリングスレッドを作成することになります。スレッドがそれより大きなスコープを持つ理由はないようです。より多くのデバイスが追加された場合は、より多くのポーラーインスタンスを作成するだけです。

OnStart()では、ポーラーインスタンス(ポーラースレッドを作成する)を作成して戻り、 'OnStart-Eventを永久に実行しないでください'という条件を満たします。

OnStop()でスレッドを停止していますか?まず、スレッドを停止する優先メソッドを試してみてください。何もしないでください。サービスマネージャーまたはタスクマネージャーからシャットダウンすると、サービスは正常に実行され、すぐに停止しますか?その場合は、OnStop()またはポーラークラスdtorでポーリングスレッドを明示的に停止しようとすると、不必要な、そして場合によっては非生産的な作業を行わないでください。 OnStop()を空のままにして、正常に機能するかどうかを確認してください。

サービスプロセスがOSによって強制終了される前にスレッドを終了する必要がある場合は、ポーラースレッドをすぐに終了するよう説得するために頼りにしなければならないかもしれません。あるいは、Thread.Interrupt ()。それが構築され、いくつかのプロジェクトのプロパティをいじるとます。installutilの正しいバージョンを実行した後、[OK]インストール

class poller 
{ 
    public static void ThreadProc() 
    { 
     for (;;) 
     { 

      Thread.Sleep(0); 
     } 
    } 
    Thread myThread; 
    public poller(){ 
     myThread = new Thread(new ThreadStart(ThreadProc)); 
     myThread.Priority = ThreadPriority.BelowNormal; 
     myThread.Start(); 
    } 
}; 

class WindowsService : ServiceBase 
{ 
    poller thisPoller; 
    public WindowsService() 
    { 
     this.ServiceName = "My Windows Service"; 
     this.EventLog.Log = "Application"; 

     this.CanHandlePowerEvent = true; 
     this.CanHandleSessionChangeEvent = true; 
     this.CanPauseAndContinue = true; 
     this.CanShutdown = true; 
     this.CanStop = true; 
    } 
    protected override void OnStart(string[] args) 
    { 
     base.OnStart(args); 
     thisPoller = new poller(); 
    } 
    protected override void OnStop() 
    { 
     base.OnStop(); 
    } 

だけ見に...依存し、私はこれを試してみました。それは私のi7で〜17%のCPU使用率を持つ 'プロセス'タブにサービスが表示されたため、スリープ(0)ループが正常に開始されました。タスクマネージャサービスで「サービス停止」を選択すると、サービスステータスは「停止」に直ちに戻りましたが、プロセスが消えるまでに約20秒かかりました(?)。

もっと楽しくなるように、私は実際に箱を積みました。私はアンインストールし、サービスを停止して再構築:

protected override void OnStart(string[] args) 
{ 
    base.OnStart(args); 
    thisPoller = new poller(); 
    thisPoller = new poller(); 
    thisPoller = new poller(); 
    thisPoller = new poller(); 
    thisPoller = new poller(); 
    thisPoller = new poller(); 
    thisPoller = new poller(); 
    thisPoller = new poller(); 
} 

私は再インストールして再起動したとき、私はタスクマネージャに得ることができる前に、私はCPUファンは、最大吹け聞くことができたので、私はそれが働いていた知っていました。確かに、すべての8つのコアに100%。

停止は8つのCPUループスレッドであっても問題ありませんでした。再びステータスは「停止」に直ちに戻り、プロセスは20秒後に消えた。

スレッドが実行されないようにスリープ間隔を「1000000」に設定しても、問題はありません。「OK」をクリックし、「OK」をクリックします。

+0

うわーありがとう!これは私にかなり役立ちます!もう1つの質問があります:OnStart()が永遠に実行されないように、ポーラーのインスタンスを作成するときにどうやって返すのですか? – MartiniMoe

+0

ポーラーインスタンスを作成し、onStart()を終了するだけです。あなたは 'poller * thisPoller;を宣言できます。サービスクラスの一番上のどこかで変数 'thisPoller =新しいポーラー(URL);' OnStart()内にあります。 –

+0

この非常にdetailled答えをありがとう!あなたは私を大いに助けました!私は15の評判を持っていないのであなたの答えを投票できません:-( – MartiniMoe

関連する問題