2012-03-15 1 views
3

サーバー上でサービスとしてアプリケーションを実行した後、そのサービスに複数のクライアントが接続しています。私はクライアントのWindowフォームアプリケーションのそれぞれに正確なサーバー時間を表示します。そのため、サーバー上の任意の時刻の変更を検出するメカニズムが必要なため、表示するクライアントに送信できます。C#イベントで夏時間や手動による時刻変更を検出する

SystemEvents.TimeChanged += new EventHandler(SystemEvents_TimeChanged); 

static void SystemEvents_TimeChanged(object sender, EventArgs e) 
    { 
     //Occurs when user manually changes the time or due to 
     //daylight saving time. Server will issue its latest time 
     //to all the clients so time can be adjusted. 
    } 

残念ながら、私はサービスとしてこれを実行すると:私はVisual Studioに以下のコードをテストするとき、すべてが素晴らしい作品ので、私は、私は運にいると思った、SystemEvents.TimeChangedを発見したMSDNを見ている

このイベントは、MSDNの細かい印刷物を見ているので、決して解雇されることはありません。TimeChangedイベントは、メッセージポンプ(別名、実行中のフォームを持っている必要があります)がアクティブなアプリケーションでのみ発生します。これは、非サービスモードとして実行するとフォームがあるため、Visual Studioで動作します。

「サービスがデスクトップとやりとりすることを許可する」オプションをチェックすることでこれを訂正できますが、その種のサービスはアプリケーションをサービスとして実行しようとする目的に反するものです。

アプリケーションでタイマーのイベントを作成して時間の変化を確認することができますが、10秒ごとにそうだとしますが、これはサーバーのマシンで発生するランダムな時間の変化を2回確認するだけの大きなオーバーヘッドです1年に3回

メッセージポンプが搭載されていないアプリケーションで動作するC#イベントが時間の変化を引き起こすことは誰も知っていますか? Microsoftがこのように動作するイベントを含まない場合は驚きです。

ありがとうございます。

+1

SystemEventsクラスは、必要に応じて別のスレッドでメッセージループをポンピングします。それを試してみてください。 –

答えて

3

あなたのご意見をいただきありがとうございます。彼らは確かに正しい方向に私を指摘しました。私は自分の問題を解決することができました。そして、私は道に迷っている人たちのために、彼らを助けてくれる人たちのためにここに置くことに決めました

サービスを実行する私のメインプログラムでは、ServiceBaseのサブクラスでなければなりません。私の主な機能には

私は次のように別のスレッドを生み出した:

new Thread(RunMessagePump).Start(); 

private void RunMessagePump() 
{ 
    Application.Run(new HiddenForm()) 
} 

この隠しフォームは、それがコードthis.ResumeLayoutによって隠されたままされたシンプルな形(falseで、その名前が言うまさにです)をIntiailaizecomponent()コードの下に置きます。

このフォームのFormLoadイベントでは、任意のシステムイベントを宣言できます。私の場合は、

private void HiddenForm_Load(object sender,EventArgs e) 
{ 
    SystemEvents.timeChanged += new EventHandler(SystemEvents_TimeChanged); 
} 

出来上がりを持っている、これは見事にうまくいく、と私は私が道を使用する任意のSystemEventsをキャプチャするために、このフォームのLoadイベントを使用すると思います。

乾杯。

3

私は、ローカルの時間に頼らないことを強くお勧めします。サーバーのUTC時間を使用し、それをローカルタイムに変換する必要がある場合は、そのタイムゾーンを知っていればどこでもそれを行うことができます。

有用なイベントなしで手動の時間変更を検出するのはやや困難ですが、(例えば)30秒ごとに実行するタイマーを実行して、UTC時間が「少なくともUTC時間以上タイマーティック+ 30いくつかの許容量で「秒」ですか?

非常に頻繁に実行する必要はありません。リソースが膨大な量になるようなものではありません。あなたはいつもあなたががより良い答えを見つけるならば:)

0

の理想よりもおそらく少ない、より効率的なものと交換することができますAPIの後ろにこれを隠すことができ、あなたはをリッスンフォアグラウンドで実行されているエージェントを持つことができますTimeChangedイベントを呼び出し、これをサービスに転送します。

関連する問題