2011-09-16 5 views
7

私たちは、AからBへの非常にクリティカルなデータをトランザクション的にシャベルする.NET Windowsサービスを提供しています。 また、サービスで使用されているすべての外部コンポーネントが正しく割り当てられておらず、サービス自体をシャットダウンする前にすべてがクリーンアップされていることを確認する必要があります。 これには数時間かかることがあります。この理由は、2,3時間後、または4時間後に到着する外部コンポーネントのコールバックでサービスが待機する必要があるためです。Windowsサービスを正常に終了するまで何時間もかかることがありますか?

  1. することで、Windowsが正常にシャットダウン へのサービスのためにそれほど長く待つのためにあるのですか?
  2. サービスには、サービスがオペレーティングシステムによってシャットダウンされているときに何が起こるかを指示できるオプションがあります。 シャットダウンを完全に防止しますか?
  3. 別のシナリオとして、サーバがリブートする必要がある場合はどうなりますか ?サービスのために何時間も待つことができますか?
  4. サービスを終了するまでOSがサービスを待機する時間に制限はありますか?
+6

あなたは忘れてしまった:5をそのマシンが適切にシャットダウンするために人が待機する時間に制限はあります、ちょうどプラグを引っ張る前に? –

答えて

7

CanStop, CanShutdown, CanHandlePowerEventを使用すると、コンピュータがシャットダウンして適切に応答したときに通知を受けることができます。

あなたのスレッドを終了するために追加の時間を要求するためにServiceBase.RequestAdditionalTimeメソッドを使用します。

protected override void OnShutdown() 
{ 
    base.RequestAdditionalTime(MaxTimeout); 
    serviceCore.OnShutdown(); 
    Stop(); 
} 

あなたOnShutdown()ブロック場合は20秒以上(CURRENTCONTROLSET \レジストリHKEY_LOCAL_MACHINE \システムに格納されているデフォルト値を\ Control \ WaitToKillServiceTimeout)、あなたのサービスは応答しないとマークされ、殺されます。

There is a good blog post from the BCL team on that subject that I recommend.

+2

'OnShutdown'内で' RequestAdditionalTime'を呼び出すと 'InvalidOperationException'が発生します。 –

4

はいサービスは終了するまでシャットダウンを停止する可能性がありますが、それは必要ですか?このためにレジストリにタイムアウト値がありますが、OSは何ですか?

私はあなたが他のコンポーネントからコールバックを切り離すか、データをディスクにバッファリングし、より小さな断片で送る必要があると思います。パワーカットではどうなりますか?または誰かが待っていて電源が切れたら?

重要なデータはメモリの外部で管理し、プロセスを再開可能にします。これはあなたの長いシャットダウンプロセスを解決します。同様に、進捗状況のためにコンポーネントをポーリングする方法は、ブロックする依存関係を取り除きます。

+0

はい、ある意味でデータは重要です。これは、大量のデータが移動、解析、および索引付けされるエンタープライズレベルのアプリケーションです。問題は、コンポーネントがゆっくりと動作することです。何時でも起きるのを待っているコールバックは最大20,000件ありますが、それは時間がかかります。ポーリングは、そのAPIが私たちに許可していないので、オプションではありません。 – John

+0

それはうんざりしている、確かに各呼び出しは数時間かかることはありませんか?小さなバッチを使用して複数のマシンにコールを分散できますか? – TheCodeKing

0

あなたは(OnShutdown内RequestAdditionalTime(MAXTIMEOUT)を使用することはできません)...

関連する問題