1

すべてのユーザーのログオンとログオフをログに記録し、サーバー上のテーブルに保存するために、C#でWindowsサービスを作成しました。

while条件付きのループを使用しtrue、このループでシステムの現在のユーザーを毎分チェックしているため、システムの電源を入れると、サービスは「開始」ステータスになります。

ここまではすべてうまくいきますが、問題はOnStop()、システムをシャットダウンしたときにメソッドが呼び出されないことです。サービスの開始時のステータスに問題があることはわかっています。サービスのメソッドでwhileループにコメントを付けると、メソッドが正しく実行されるためです。OnStart()OnStop()

4

2 に答える 2

4

OnStart (および OnStop) は、サービスを初期化しから終了するように設計されています。私が通常行うことは、別のスレッドを作成し(これはTPLが作成される前でした)、スレッドを開始して完了です。

あなたの場合、スレッドはタイマーを開始し、サービスが停止したときに OnStop メソッドから送信される停止信号を待ちます。停止信号が到着すると、タイマーを停止する必要があります。

于 2012-07-09T05:37:49.047 に答える
2

OnStart() はオペレーティング システムを返す必要があります。以下は MSDN ドキュメントです。

サービス アプリケーションは長時間実行されるように設計されています。そのため、通常はシステム内の何かをポーリングまたは監視します。監視は OnStart メソッドで設定されます。ただし、OnStart は実際には監視を行いません。 サービスの操作が開始されたら、OnStart メソッドはオペレーティング システムに戻る必要があります。永久にループしたり、ブロックしたりしてはなりません。


単純なポーリング メカニズムを設定するには、System.Timers.Timer コンポーネントを使用できます。OnStart メソッドでは、コンポーネントにパラメーターを設定してから、Timer.Enabled プロパティを true に設定します。タイマーはコード内で定期的にイベントを発生させ、その時点でサービスが監視を行うことができます。

http://msdn.microsoft.com/en-us/library/aa984464%28v=vs.71%29.aspx

于 2012-07-09T05:42:37.220 に答える