分享我在工作中遇到的多线程下导致RCW无法释放的问题
最近有个同事在调用一个类库中的方法时遇到了一个问题,异常信息如下:
尝试释放正在使用的RCW,活动线程或其他线程上正在使用该 RCW,释放正在使用的 RCW 的尝试会导致损坏或数据丢失。
该方法中对word文件进行相关了操作,因为我之前也在多线程环境下调用过该方法,并且没遇到这个问题,所以同事让我过去看看怎么回事。这个方法在对文件进行相关操作后,会调用另外一个方法释放word对象,部分代码如下:
Word._Application t = oWord as Word._Application; object oIsSave = false; t.Quit(ref oIsSave, ref oMissing, ref oMissing); System.Runtime.InteropServices.Marshal.ReleaseComObject(oDoc); System.Runtime.InteropServices.Marshal.ReleaseComObject(oWord); oWord = null; oDoc = null; GC.Collect(); GC.Collect();
该段代码是为了保证立即释放word对象并关闭word进程。因为异常信息定位在这里,所以我过去后就从这里开始看,但是看了半天,也没看出类库中的方法有什么问题,因为之前我使用的时候没遇到这种情况,因此我觉得可能不会是这里的问题,并且我负责的那个产品已经经过了大量的测试,肯定是没问题的,所以我说让我看看你是怎么调用的吧,打开他的代码看了一眼,整体上没什么其他问题,但是有个地方引起了我的注意,代码中对该类的实例化放在了全局范围,因为是个cs项目,这么做会导致该对象始终被引用,因此即使在垃圾回收时也无法被释放,而这里调用的又是com组件,就导致了word进程无法关闭,并且同事在这里用的是多线程,所以程序一运行起来,会出现一大堆word进程关不掉。于是就将这里的对象实例化放到了线程方法中,这样在方法执行结束后,堆中的对象就处于无引用状态,在垃圾回收时就被释放了,问题就自然解决了。其实这里跟单线程还是多线程没关系,主要是在全局范围内进行实例化导致了对象不能被垃圾回收,所以在写代码的时候一定要注意对象的生命周期。
上一篇:详解C#打开和关闭可执行文件
栏 目:C#教程
下一篇:轻松学习C#的抽象类
本文标题:分享我在工作中遇到的多线程下导致RCW无法释放的问题
本文地址:https://www.xiuzhanwang.com/a1/C_jiaocheng/6795.html
您可能感兴趣的文章
- 01-10WPF实现类似360安全卫士界面的程序源码分享
- 01-10C#编程自学之数据类型和变量二
- 01-10C#编程自学之运算符和表达式
- 01-10分享WCF聊天程序--WCFChat实现代码
- 01-10分享WCF文件传输实现方法---WCFFileTransfer
- 01-10C#实现简单的登录界面
- 01-10分享一个C#编写简单的聊天程序(详细介绍)
- 01-10C#读写指定编码格式的文本文件
- 01-10Windows中使用C#为文件夹和文件编写密码锁的示例分享
- 01-10基于C#实现网页爬虫
阅读排行
本栏相关
- 01-10C#通过反射获取当前工程中所有窗体并
- 01-10关于ASP网页无法打开的解决方案
- 01-10WinForm限制窗体不能移到屏幕外的方法
- 01-10WinForm绘制圆角的方法
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频播放器左下角滚动新
- 01-10C#停止线程的方法
- 01-10C#实现清空回收站的方法
- 01-10C#通过重写Panel改变边框颜色与宽度的
- 01-10C#实现读取注册表监控当前操作系统已
随机阅读
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10SublimeText编译C开发环境设置
- 01-10C#中split用法实例总结
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10delphi制作wav文件的方法
- 04-02jquery与jsp,用jquery
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-11ajax实现页面的局部加载
- 08-05DEDE织梦data目录下的sessions文件夹有什