0

複数の .xps ドキュメントを物理プリンターに印刷すると、このエラーが発生します

Dim defaultPrintQueue As PrintQueue = GetForwardPrintQueue(My.Settings.SelectedPrinter)
Dim xpsPrintJob As PrintSystemJobInfo
xpsPrintJob = defaultPrintQueue.AddJob(JobName, Document, False)

ドキュメントは、印刷ジョブの例外が発生するまで正常にスプールされます

InnerException は、プログラムの実行を続行するにはメモリが不足しています。

ソースはPresentationCore.dll

どこから探し始めればいいですか?

4

3 に答える 3

5

一部のリソースに対する一時的または永続的な制限のために失敗する可能性のあるタスクを実行しようとするとき、私はバックオフ戦略を使用する傾向があります. この戦略は、メッセージ キューイングやソケット オープンなど、さまざまな分野で採用されています。

このような戦略の一般的なプロセスは次のとおりです。

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をグーグルでチェックして見つけました。そのページで「この問題に関連するホットフィックス」という文字列を検索します。

于 2009-12-27T03:27:19.600 に答える
1

各ドキュメントの印刷を処理する新しいプロセスを起動することを検討することをお勧めします。オーバーヘッドは、ドキュメントを印刷する労力に比べて低くなるはずです。

于 2010-01-01T07:40:57.253 に答える
1

新しいジョブをキューに追加する前に、キューの状態を確認する必要があります。キューがエラー状態にないことを確認するために照会できるPrintQueue.IsOutOfMemoryプロパティと関連プロパティの詳細。

もちろん、プリンターなどのリソースにアクセスするときに防御戦略を使用するという pax のヒントは、ベスト プラクティスです。try手始めに、ジョブを追加する行をブロックに入れたいと思うかもしれません。

于 2009-12-25T13:06:57.753 に答える