找回密码
 立即注册

QQ登录

只需一步,快速开始

menghuanyunxia

高级会员

111

主题

396

帖子

1075

积分

高级会员

积分
1075

活字格认证微信认证勋章元老葡萄

menghuanyunxia
高级会员   /  发表于:2013-10-23 10:37  /   查看:10650  /  回复:17
farpoint打开包含图片和chart的excel之后内存不会释放

17 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2013-10-23 12:23:00
沙发
回复 1楼menghuanyunxia的帖子

menghuanyunxia 你好,
加载 Excel 文件后,Spread 会 host 很多对象,所以不会释放内存。尤其是在有大量图片和图表情况下,占用内存也会逐渐累积。
回复 使用道具 举报
menghuanyunxia
高级会员   /  发表于:2013-10-23 12:32:00
板凳
但是我关闭当前excel文件的时候应该需要释放当前内存,而不应该一直占用内存,这样会导致程序中的中增加很多无法释放的垃圾内存
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-10-23 13:40:00
地板
回复 3楼menghuanyunxia的帖子

menghuanyunxia 你好,
请问“关闭当前excel文件”指的是否是关闭当前包含 Spread 的应用?如果是,由于 .NET 平台下的托管代码占用内存通过 GC 垃圾回收机制来控制的。占用的内存用可能没有立即释放。
回复 使用道具 举报
menghuanyunxia
高级会员   /  发表于:2013-10-23 13:45:00
5#
public new void Dispose()
        {
            try
            {
                this.SuspendLayout();
                foreach (SheetView sheet in this.Sheets)
                {
                    var shapes = sheet.DrawingContainer.ContainedObjects;
                    if (shapes != null)
                    {
                        foreach (var item in shapes)
                        {
                            var shape = item as PSShape;
                            if (shape != null)
                            {
                                shape.Dispose(true);
                            }
                        }
                    }

                    try
                    {
                        if (sheet.Charts != null)
                        {
                            sheet.Charts.Clear();
                        }

                        if (shapes != null)
                        {
                            shapes.Clear();
                        }

                        sheet.ClearShapes();
                        sheet.Rows.Clear();
                        sheet.Columns.Clear();
                    }
                    finally
                    {
                        sheet.Dispose();
                    }
                }

                this.Sheets.Clear();
            }
            catch (Exception ex)
            {
               LoggingService.Error("释放内存失败:"+ex);
            }
         
            base.Dispose(true);
            GC.SuppressFinalize(this);
        }
回复 使用道具 举报
menghuanyunxia
高级会员   /  发表于:2013-10-23 13:47:00
6#
需要如此才能释放,由于贵公司的farpoint关闭Spread 的时候没有释放里面的图片对象和chart对象,所以导致遗留了垃圾内存,无法释放掉
回复 使用道具 举报
menghuanyunxia
高级会员   /  发表于:2013-10-23 13:48:00
7#
我认为这可能是贵公司的的一个bug,释放spread的时候没有释放spread里面的其他对象
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-10-23 15:45:00
8#
回复 7楼menghuanyunxia的帖子

menghuanyunxia 你好,

.NET 平台下的垃圾回收机制是由GC垃圾回收机制管理的。并且GC的回收频率及时间是不可控制的。微软官方也不建议用户去手动调用GC,会出现不可预期的问题。

同样,Spread 控件的内存消耗,也是遵循.NET 托管环境下 GC 垃圾回收机制的。所以关闭了当前的 Spread 窗体,GC 没有来回收内存。就会出现程序关闭但是仍然占用内存的现象。
举例来说,在 form 上添加 上万 个 button,关闭这个 form 时,内存也不会及时回收。
回复 使用道具 举报
menghuanyunxia
高级会员   /  发表于:2013-10-24 08:46:00
9#
你好,我上面的那段代码并没有强制去回收垃圾,只是清除掉了你们spread里面的图片集合已经chart集合,我做了一次测试,如果不清楚里面的集合,内存不管等多久都不会释放,除非关掉程序,如果清除了里面的那两个集合一段时间之后内存会释放的
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2013-10-24 11:53:00
10#
回复 9楼menghuanyunxia的帖子


menghuanyunxia 你好,

我这边继承了 Spread ,添加了 5# 中的方法,并没有出现明显的时间差异(通过任务管理器监测)。
附件是我的测试 Demo,如果有使用不当的地方,还请指出来:

10744.zip (2.67 MB, 下载次数: 393)
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部