【问题标题】:Printing multiple report using Crystal Report crash applcation使用 Crystal Report 崩溃应用程序打印多个报表
【发布时间】:2016-02-07 18:33:00
【问题描述】:

我有一个带有 Crystal Reports (13.0.15) 的 WinForms 应用程序(.net 4.0、x86)。我想使用 Crystal Reports 打印多个文档(而不是在报表查看器上看到它们 - 直接在打印机上)。

foreach (var document in documents )
{
  ReportDocument report=GenerateReport(document.id);
  report.PrintToPrinter(printerSettings, pageSettings, false);
}

每次打印 48 份报告时,在第 49 次打印时出现异常 System.ComponentModel.Win32Exception The handle is invalid Void OnStartPrint(System.Drawing.Printing.PrintDocument, System.Drawing.Printing.PrintEventArgs)

我尝试了另一组文档,但 49 打印仍然有异常。

我尝试将 PrintJobLimit 更改为 9000 以上,但没有帮助。

接下来我尝试在打印后处理报告:

foreach (var document in documents )
{
  using (ReportDocument report=GenerateReport(document.id))
  { 
    report.PrintToPrinter(printerSettings, pageSettings, false);
  }
}

但现在程序在打印第 28 个报告之前崩溃,我无法捕获异常(程序停止工作)。只有在事件查看器中是有关应用程序错误 (Faulting module name: ntdll.dll) 的信息。 我尝试了不同的东西(以及它们的组合):

    report.Close();

    report.Dispose();

    report=null;

即使在打印后GC.Collect(),但它仍然无法正常工作。 有人有解决办法吗?

【问题讨论】:

    标签: c# .net winforms crystal-reports


    【解决方案1】:

    似乎当report.PrintToPrinter 返回时,底层操作有时会继续进行。你需要让reportDocument 存活一段时间,而不是让它超出范围并启动 GC 收集。

    我的解决方案是将它们放入延迟队列中,稍后Close 他们,类似于:

    foreach (var document in documents )
    {
        ReportDocument report = GenerateReport(document.id);
      
        report.PrintToPrinter(printerSettings, pageSettings, false);
        Task.Run(async () => {
            // keep report alive for extra 60 secs
            await Task.Delay(60 * 1000);
            report.Close();
            report.Dispose();
        })
      
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-28
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      相关资源
      最近更新 更多