找回密码
 立即注册

QQ登录

只需一步,快速开始

lmbosos

最新发帖
iceman
社区贡献组   /  发表于:2012-10-25 10:53:00
11#
回复 10楼lmbosos的帖子

lmbosos 你好,
.NET 托管 GC 内存回收机制为:如果对象被占用,那么将不回收。也就是说,打开一个 Excel 文件,在没有结束调用的情况下,GC 是不会对其占用内存进行回收的。所以,如果多次打开 excel 文件。内存就会累积,从而造成OutOfMemoryException。我想应该从这方面入手。
推荐一篇文章,希望会对你帮助:http://blog.csdn.net/sykpboy/article/details/342971
回复 使用道具 举报
lmbosos
中级会员   /  发表于:2012-10-25 11:39:00
12#
如果关闭了含有FpSpread的窗体,并且
Form.Dispose();
form = null;
那你认为这时的FpSpread可以被回收呢,还是不可以

事实上经FpSpread操作的内存仍被占用,为什么呢?
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2012-10-25 12:11:00
13#
回复 12楼lmbosos的帖子

lmbosos 你好,
关于 12 # 中你所说的情况,Form.Dispose();form = null; 中的 form 是否为一个 子 form?form关闭时程序时主程序是否关闭呢?如果能给我发一个演示程序最好。
调用 Dipose 只是通知 GC ,这块内存可以内回收,而不是立即回收。
回复 使用道具 举报
lmbosos
中级会员   /  发表于:2012-10-25 13:00:00
14#
在调试时调 GC.Collect() 后依然不见内存减少。

form关时,主程序不关。当然主程序关了内存就释放了,但总不能要求我每操作一次就关一下主程序吧,岂有此理!

再有异常调用栈我已经发上来了,从上面可以看出是FpSpread内部引发的异常,为什么一定要考虑是外部的问题呢,至少你们应该检查一下你们的程序是不是存在着没有释放内存的代码吧。

况且出现此问题的并非我一家用户,坛子里也存在报告相同问题的帖子,可是你的解决问题的套路却是一样的!!
回复 使用道具 举报
lmbosos
中级会员   /  发表于:2012-10-25 13:10:00
15#
bool SheetView.OpenExcel(string fileName,   int excelSheetIndex)

上面这个方法,无论是输入参数还是返回值,均没有需要我显示Dispose的对象存在。而内存的产生就在这个方法中。

关闭窗体时,我对每个Sheet执行了以下代码
SheetView.Dispose();
SheetView = null;

之后又关了FpSpread
FpSpread.Dispose();
FpSpread = null;

而后我又关了form
form.Dispose();
form = null;

此时在调试中调用 GC.Collect();

结果是:内存依旧没释放!!!
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-10-25 15:48:00
16#
lmbosos 你好

附件是我做的一个测试工程,运行工程之后,输入执行次数点击【打开1】或者【打开2】,在打开的窗体中点击【执行】,记录6522_OpenExcel进程所使用的内存情况;关闭弹出的窗体,再次点击【打开1】或【打开2】并点击【执行】此时6522_OpenExcel进程进程所使用的内存总量并没有发生变化,使用的内存量与你的Excel大小有关,而且被占用的内存只有在完全退出该应用程序时才会被释放。请使用该工程对你的Excel文件进行测试,同时,能否将你的Excel发给我们进行测试。非常感谢。

6522_OpenExcel.zip (1.66 MB, 下载次数: 17881)
回复 使用道具 举报
lmbosos
中级会员   /  发表于:2012-10-25 16:21:00
17#
重申一点请在Spread for Windows v5.0.3505版本中解决问题,因为我们买的只是这个版本。

你写的这个Demo是基于 6.0.3505.2008 的,我根本就没有这个类库,运行不了。

很抱歉涉及商业秘密不能提供我的Excel文件。
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-10-25 17:52:00
18#
以上代码同样适用于 v5.0.3505 版本,你只需将工程中引用的 Spread 相关Dll修改为 v5.0.3505 版本就能运行程序。
回复 使用道具 举报
lmbosos
中级会员   /  发表于:2012-10-26 10:06:00
19#
你给的demo在我这边运行出现的问题一样,关闭form时并没有释放内存
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2012-10-26 12:10:00
20#
lmbosos 你好

在运行Demo时,有三个时期占用的内存会改变:
1、运行程序打开主窗体,比如此时占用10M内存
2、点击【打开1】按钮打开子窗体,比如此时占用内存为30M
3、点击【执行】时,比如此时占用内存为50M
4、关闭子窗体,此时内存还是会维持在50M(此时不会自动释放子窗体占用的资源)
5、重复第2、3步操作时,占用的内存还是会维持在50M,不会增加

步骤4所占用的内存在关闭子窗体时不会立即释放,只有等到内存回收时才会释放,这一点主要是受.NET运行机制决定的。

此外,我这边运行Demo执行步骤5时,不会累积增加占用的内存,重复执行时占用的内存会维持在一个固定的范围内(比如 50M 左右),不知你执行的结果是不断往上累加,还是会维持在一个比较固定的范围。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部