:-)私の最初のサービスアプリケーションであるとして。おそらく、ポーラークラス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」をクリックします。
あなたは自分で立ち往生し、遭遇したときに特定の問題に戻る必要があります。 – Nick