首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何避免在浏览多个报表时发生ReportViewer内存泄漏?

如何避免在浏览多个报表时发生ReportViewer内存泄漏?
EN

Stack Overflow用户
提问于 2015-02-03 00:16:00
回答 3查看 5.6K关注 0票数 2

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

代码语言:javascript
复制
 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();

    }

有没有办法在呈现新报表后释放旧报表资源?

EN

回答 3

Stack Overflow用户

发布于 2015-02-03 01:38:10

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

代码语言:javascript
复制
reportViewer.Dispose();
GC.SuppressFinalize(reportViewer);

整个处理方法可能会变得非常令人困惑,所以请慢慢来,看看这里:MSDN - Implementing a Dispose Method MSDN - IDisposable.Dispose Method

票数 1
EN

Stack Overflow用户

发布于 2015-12-10 01:12:56

我在.NET 4.5和2013上也遇到了同样的问题

我尝试了几种方法,但最终让它起作用的是:

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

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

票数 0
EN

Stack Overflow用户

发布于 2016-12-19 21:29:19

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

它可能看起来有点复杂,但事实并非如此。我们的想法是创建一个AppDomain,在那个域中做你的报告工作,然后卸载域。卸载时释放所有内存:-)

我已经使用了这个解决方案,它为我解决了这个问题。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28281986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档