一部のリソースに対する一時的または永続的な制限のために失敗する可能性のあるタスクを実行しようとするとき、私はバックオフ戦略を使用する傾向があります. この戦略は、メッセージ キューイングやソケット オープンなど、さまざまな分野で採用されています。
このような戦略の一般的なプロセスは次のとおりです。
set maxdelay to 16 # maximum time period between attempts
set maxtries to 10 # maximum attempts
set delay to 0
set tries to 0
while more actions needed:
if delay is not 0:
sleep delay
attempt action
if action failed:
add 1 to tries
if tries is greater than maxtries:
exit with permanent error
if delay is 0:
set delay to 1
else:
double delay
if delay is greater than maxdelay:
set delay to maxdelay
else:
set delay to 0
set tries to 0
これにより、ほとんどの場合、プロセスを全速力で実行できますが、エラーが発生し始めると元に戻り、リソース プロバイダーが回復する時間を確保できます。遅延が徐々に増加することで、より深刻なリソース制限を回復できるようになり、最大試行回数により、永続的なエラー (または回復に時間がかかりすぎるエラー) と呼ばれるものが検出されます。
私は、実際には、チェックと試行の間で何かが変更された場合、後者はまだ失敗することが多いため、チェック-if-oky-then-try アプローチよりも、この try-it-and-catch-failure アプローチを好みます。これは「許可を求めるよりも許しを求める方が良い」方法と呼ばれ、ほとんどの場合上司とうまく機能し、妻とはあまりうまくいきません:-)
特に有用なケースの 1 つは、存続期間の短いトランザクションごとに個別の TCP セッションを開くプログラムです。古いハードウェアでは、閉じられたソケット (TCP WAIT 状態のもの) は、再び必要になる前に最終的に消えてしまいました。
しかし、ハードウェアが高速化するにつれて、セッションを開いて作業を行うことがはるかに高速になり、Windows で TCP ハンドルが不足することがわかりました (最大に増加した場合でも)。
セッションを維持するために通信プロトコルを再設計するのではなく、この戦略を実装して、イベント ハンドルが枯渇したときに正常に回復できるようにしました。
確かに少し面倒ですが、これは寿命が近づいているレガシーソフトウェアであり、多くの場合、バグ修正だけで機能するだけで十分であり、適切に修正するために多額の費用を費やすことを正当化するほど戦略的であるとは見なされませんでした.
更新: PresentationCore に (より永続的な) 問題がある可能性があります。このKB 記事には、.NET 3.5SP1 内の WPF でメモリ リークがあることが記載されています (印刷ドライバーがクライアントである可能性があります)。
バックオフ戦略で問題が解決しない場合 (長期にわたるプロセスでのリークの場合は解決しない可能性があります)、修正プログラムを適用してみてください。私なら、仮想マシンで問題を再現し、パッチを適用してテストします (ただし、私は極度の偏執狂です)。
PresentationCore Insufficient memory to continue the execution of the program
最初のリンクhereをグーグルでチェックして見つけました。そのページで「この問題に関連するホットフィックス」という文字列を検索します。