8

非常に重要なデータを大量に A から B にトランザクション方式で移動する .NET Windows サービスがあります。また、サービスで使用されるすべての外部コンポーネントが正しく割り当て解除され、サービス自体をシャットダウンする前にすべてがクリーンアップされていることを確認する必要があります。これには何時間もかかることがあります。これは、2、3、または 4 時間後に到着する外部コンポーネントのコールバックをサービスが待機する必要があるためです。

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

3 に答える 3

8

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

ServiceBase.RequestAdditionalTime メソッドを使用して、スレッドを終了する追加の時間を要求します。

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

OnShutdown() が 20 秒 (レジストリ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WaitToKillServiceTimeout に格納されている既定値) を超えてブロックされた場合、サービスは無応答としてマークされ、強制終了されます。

BCL チームによる、このテーマに関する優れたブログ投稿をお勧めします。

于 2011-09-16T07:40:50.180 に答える
4

はい、サービスは完了するまでシャットダウンを停止できますが、そうすべきですか? このためのレジストリにタイムアウト値があります。OS は何ですか?

コールバックを他のコンポーネントから分離するか、データをディスクにバッファリングして小さなフラグメントで送信する必要があると思います。停電で何が起こる?または、誰かが待つのにうんざりしてスイッチを切った場合はどうなりますか?

データが重要な場合は、メモリの外部で管理し、プロセスを再開できるようにします。これにより、長いシャットダウンプロセスが解決されます. 同様に、進行状況についてコンポーネントをポーリングする方法は、ブロックへの依存を取り除きます。

于 2011-09-16T06:52:55.827 に答える
0

OnShutdown() 内で RequestAdditionalTime(MaxTimeout) を使用することはできません ...

于 2013-09-25T07:37:44.713 に答える