【问题标题】:How to manage Crystal Report Dispose?如何管理 Crystal Report Dispose?
【发布时间】:2019-04-11 23:58:11
【问题描述】:

在 Crystal Reports 13 的 Visual Studio 2012 版本中,有一个阈值可将并发报表(这也包括子报表)限制为跨计算机的 75 个报表。这意味着,如果给定服务器上有 5 个 Web 应用程序,则所有 5 个 Web 应用程序中所有打开的报告都计入 75 个报告限制。

该错误以不同的方式表现出来,并可能导致以下错误“没有足够的内存用于操作”。或“已达到系统管理员配置的最大报表处理作业限制”。

问题是报告没有被处理,它们会继续累积,直到达到 75 个限制。要解决此问题,必须尽早处理报告。这听起来很简单,但并不像看起来那么简单。根据生成报告的方式,有两种情况:第一种是生成 PDF 或 Excel 电子表格,第二种是使用 Crystal Report Viewer。每个场景都有不同的生命周期,我们在制定解决方案时需要考虑到这一点。

【问题讨论】:

    标签: c# asp.net-mvc crystal-reports


    【解决方案1】:
           private bool disposed = false;
    
            protected virtual void Dispose(bool disposing)
            {
                if (!this.disposed)
                {
                    if (disposing)
                    {
                        context.Dispose(); //context means your crystal report document object.
                    }
                }
                this.disposed = true;
            }
    
            public void Dispose()
            {
                Dispose(true);
                GC.SuppressFinalize(this);
            }
    

    【讨论】:

      【解决方案2】:

      已解决

      CurrentJobLimit 是并发报告的计数器。
      此计数器管理不善,因此很容易增加,即使实际报告数量较少。

      我解决了以编程方式关闭 Crystal Report 文档的问题。

      protected void Page_Unload(object sender, EventArgs e)
       {
        CrystalReportViewer1.ReportSource.Close();
       }
      

      反正75的个数可以通过registry来增加:

         HKEY_LOCAL_MACHINE\SOFTWARE\CRYSTAL DECISIONS\10.0\REPORT APPLICATION SERVER\SERVER\PrintJobLimit
      

      (但这只是一种解决方法....)

      【讨论】:

      • @NisargShah 发生了什么?此代码行中是否遇到断点?
      • 我也有同样的问题。执行在 Close 语句上冻结。 (CR13)
      【解决方案3】:

      我有一段旧代码自动为 Crystal Reports 生成主机 WinForm 表单,当表单关闭时,它有一个特定的行可以在报表类上调用 Close(),我很确定那是因为处理问题。那么这里可能是这种情况吗?

      这可能也适用于旧版本的 Crystal,所以可能是一个红鲱鱼。

      【讨论】:

        【解决方案4】:

        我觉得你应该试试
        - 代表关闭()
        -rep.Dispose()
        - CrystalReportViewer1.Dispose()

        *我的功能

        Protected Sub close_and_dispose_report(ByRef r As ReportDocument)
                If Not r Is Nothing Then
                    r.Close()
                    r.Dispose()
                    CrystalReportViewer1.Dispose()
                End If
            End Sub
        

        导航到其他页面时

        Protected Sub Page_Unload(sender As Object, e As EventArgs) Handles Me.Unload
                Me.close_and_dispose_report(rep)
        End Sub
        

        关闭网页时

        Protected Sub Page_Disposed(sender As Object, e As EventArgs) Handles 
                Me.Disposed
                Me.close_and_dispose_report(rep)
        End Sub
        

        【讨论】:

          猜你喜欢
          • 2011-05-30
          • 2023-02-03
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多