0

PrintTickets多数の印刷に使用していますが、問題なく印刷されていWPF objectsます。dllhost.exeプログラムが大量のメモリを使用し、最終的にマシンがクラッシュするまで上昇するという状況が報告されています。と の作成に絞り込みましPrintTicketprintqueue.getprintcapabilitiesasxml()。これらが呼び出されるたびに、dllhost.exe毎回のメモリ使用量が 3 MB 以上ジャンプします。可能であればこれを回避する方法、または使用されていることを知った後にそれをクリアする方法があるかどうか、誰か教えてもらえますか?

更新:単純なこのコードでプロジェクトを作成しました。

for (int i = 0; i < 100; i++)
{
    using (System.Printing.PrintQueue pQueuePrnt = 
    new LocalPrintServer().GetPrintQueue("HP LaserJet 9050 PCL 5"))
    {
        using (MemoryStream printerCapXmlStream = pQueuePrnt.GetPrintCapabilitiesAsXml())
        {
            Console.WriteLine(printerCapXmlStream.Length);
        }
    }
}

これにより、約 60 MB がなくなるdllhost.exeことはありません。

4

1 に答える 1

1

原因不明のメモリの増加が見られる場合は常に、コードのどこかでメモリ リークが発生していることを最初に疑う必要があります。呼び出したすべての関数をチェックし、それらの戻り値を追跡し、使い終わったらすべて破棄していることを確認してください。

あなたはそれを への呼び出しに絞り込んだと言いますPrintQueue.GetPrintCapabilitiesAsXml。それは良いスタートです。それでは、そのメソッドのドキュメントをチェックして、それが何を返すかを見てみましょう。あ、返ってきた

MemoryStreamプリンターの機能を指定する

では、a が正確に何であるかを調べる必要がありますMemoryStreamIDisposable特に、それがインターフェースを実装しているかどうかを知る必要があるため、コードによって破棄する必要があります。documentationによると、 からMemoryStream継承するため、そうStreamです。

おそらく、コードはこれらの新しいMemoryStreamオブジェクトをすべて取得し、アンマネージ リソースをリークさせています。Disposeオブジェクトごとにメソッドを明示的に呼び出すか、それらの取得と使用をusingステートメントでラップする必要があります。例えば

using (MemoryStream ms = PrintQueue.GetPrintCapabilitiesAsXml())
{
    ms.DoSomething();
    // ...
} // the object is automatically disposed here
于 2013-04-16T03:58:04.207 に答える