【问题标题】:How to avoid ReportViewer memory leak when navigating through many reports?浏览多个报表时如何避免 ReportViewer 内存泄漏?
【发布时间】:2015-02-02 16:15:59
【问题描述】:

我正在使用 Visual Studio 2013 创建一个具有一些报表生成功能的 WPF 桌面应用程序,我有大约 30 个报表,用户可以从一个报表切换到另一个报表。我的问题是每次我更改ReportEmbeddedResource 然后调用RefreshReport() 方法时,内存都会增加,所以如果用户浏览所有30 个报告,我的应用程序将消耗大约130 Mb!我知道我必须在每次导航后释放资源,我用谷歌搜索但没有找到答案;这是我的代码

 public MainWindow() // constructor
    {
        InitializeComponent();
        this.reportViewer.ZoomMode = Microsoft.Reporting.WinForms.ZoomMode.PageWidth;
        InitDataSources();
    } 
private void InitDataSources()
    {
        //manager data source
        mangerDataSource = new ReportDataSource();
        mangerDataSource.Name = "ManagerDataSet";
        mangerDataSource.Value =  uow.Members.GetAll().
        ToList().Where((s) => s.MemberType == MemmberTypes.Manager);
        reportViewer.LocalReport.DataSources.Add(mangerDataSource);
       //adding 2 other data sources
    }
  public void RenderReport(string reportKey)
    {
        reportViewer.Reset();            
        string path = "Manager";
        if (reportKey.Contains("tea")) path = "Teacher";
        if (reportKey.Contains("stu")) path = "Student";

        reportViewer.LocalReport.ReportEmbeddedResource = string.Format(
            "Printers.Reports.{0}.{1}.rdlc", path,reportKey);
        reportViewer.RefreshReport();

    }

渲染新报表后有没有办法释放旧报表资源?

【问题讨论】:

  • 你找到答案了吗?
  • 不,我没有,我记得我曾经读到微软在他们的错误数据库中有这个错误,但它计划在未来修复,因为它目前不是他们的首要任务!我没有我所说的链接。

标签: c# wpf memory-leaks reportviewer


【解决方案1】:

我对此没有太多经验,但似乎您能做的最好的事情是使用安全句柄将您的报告放入可管理的包装器中,然后使用 Dispose 方法并强制垃圾收集器收集,同时抑制终结器。请注意,您在任务管理器中看到的内存使用情况是保留内存,而不是当前使用的实际内存;有可能您释放了报告对象并且任务管理器继续报告可执行文件的高内存值。

reportViewer.Dispose();
GC.SuppressFinalize(reportViewer);

整个处理方法可能会变得相当混乱,所以花点时间看看这里: MSDN - Implementing a Dispose Method MSDN - IDisposable.Dispose Method

【讨论】:

    【解决方案2】:

    我在 .NET 4.5 VS 2013 中遇到了同样的问题

    我尝试了几件事,但最终成功的是:

    在 x64 中编译项目并使用 LocalReport.ReleaseSandBoxAppDomain()

    我从这里得到了部分解决方案:Very High Memory Usage in .NET 4.0

    【讨论】:

      【解决方案3】:

      MarkJ_KY 在https://connect.microsoft.com/VisualStudio/feedback/details/527451/ms-report-viewer-memory-leak-any-update-fix-winforms-application的评论解决了问题

      它可能看起来有点复杂,但事实并非如此。这个想法是创建一个 AppDomain,在该域中进行报告,然后卸载该域。卸载时所有内存都被释放:-)

      我已经使用了为我解决问题的解决方案。

      【讨论】:

      • 不要在答案中只提供链接。
      猜你喜欢
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 2018-04-08
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多