【问题标题】:System.Printing Printqueue.AddJob methods consumes memory and doesnt releases once the document is printedSystem.Printing Printqueue.AddJob 方法会消耗内存,并且在打印文档后不会释放
【发布时间】:2014-06-25 13:32:34
【问题描述】:

我在我的应用程序中使用 System.Printing 库和 .net 框架 3.5。当我使用 PrintQueue.AddJob 在任何打印机上打印作业时,内存会增加并且不会释放它。仅当应用程序关闭时才会释放内存。 如果我打印超过 10 个作业,那么我的应用程序会使用我计算机的所有内存,最后一切都会变慢。 我观察到内存使用量达到 2GB,这是不可接受的。 经过调查,我发现调用 PrintqQueue.AddJob 方法时内存会增加。

这是我的打印示例代码:

PrintServer printServer = newPrintServer(@"\\sshinde");
PrintQueue PrintQ = newPrintQueue(printServer, "HP_Printer", PrintSystemDesiredAccess.AdministratePrinter);
PrintQ.AddJob("xyz", @"C:\ProgramData\MyComapny\PrintSoftware\Config\Print_Manager\INPUT\d7a8a71b-4e73-43ec-8ee9-bbe24b3ba2cb.xps", false);

【问题讨论】:

  • 你试过打电话给GC.Collect()吗?
  • @golergka 如果可能,最好避免手动垃圾收集。 @Sagar PrintQueue 实现 IDisposable 吗?
  • 嗯,这只是一个了解发生了什么的建议。
  • 在这种情况下,它不会有任何区别,因为如果 printqueue 上的 dispose 方法从未被调用,它的资源将不会被释放,即使手动强制垃圾回收 ;)跨度>
  • GC.Collect() 我试过了,但它没有释放内存

标签: c# .net system.printing .net-3.5


【解决方案1】:

发生的事情是PrintQueueDispose() 方法从未被调用。

如果这没有发生,它不会释放任何非托管资源,也不会让垃圾收集器清理它。

更多信息见:

http://msdn.microsoft.com/en-us/library/ms584331(v=vs.110).aspx

您可以在处理完打印队列后手动调用Dispose(),或者使用using 语句封装它,如下所示:

using(PrintServer printServer = newPrintServer(@"\\sshinde"))
{
  using(PrintQueue PrintQ = newPrintQueue(printServer, "HP_Printer", PrintSystemDesiredAccess.AdministratePrinter))
  {
    PrintQ.AddJob("xyz", @"C:\ProgramData\MyComapny\PrintSoftware\Config\Print_Manager\INPUT\d7a8a71b-4e73-43ec-8ee9-bbe24b3ba2cb.xps", false);
  }
}

一旦using 语句中的语句完成,就会调用Dispose 方法。

using 语句的优点是,如果发生异常,它会调用 dispose 方法甚至

【讨论】:

    猜你喜欢
    • 2013-04-25
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2019-08-03
    相关资源
    最近更新 更多