分享我在工作中遇到的多线程下导致RCW无法释放的问题
作者:眼神与背影 时间:2022-10-14 21:07:29
最近有个同事在调用一个类库中的方法时遇到了一个问题,异常信息如下:
尝试释放正在使用的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进程关不掉。于是就将这里的对象实例化放到了线程方法中,这样在方法执行结束后,堆中的对象就处于无引用状态,在垃圾回收时就被释放了,问题就自然解决了。其实这里跟单线程还是多线程没关系,主要是在全局范围内进行实例化导致了对象不能被垃圾回收,所以在写代码的时候一定要注意对象的生命周期。
标签:多线程,rcw,释放
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
java基础检查和未检查异常处理详解
2023-10-25 11:10:25
![](https://img.aspxhome.com/file/2023/2/128232_0s.png)
Java中CyclicBarrier和CountDownLatch的用法与区别
2021-09-09 08:20:01
![](https://img.aspxhome.com/file/2023/1/76221_0s.png)
一款非常简单酷炫的LoadingView动画效果
2021-11-09 11:49:08
![](https://img.aspxhome.com/file/2023/7/137347_0s.gif)
Java中用enum结合testng实现数据驱动的方法示例
2021-08-04 07:44:21
![](https://img.aspxhome.com/file/2023/9/65179_0s.png)
浅谈Java多进程程序的运行模式
2021-07-06 11:06:49
19款Javascript富文本网页编辑器
2021-12-08 23:48:45
![](https://img.aspxhome.com/file/2023/3/70623_0s.jpg)
Java使用openOffice对于word的转换及遇到的问题解决
2021-12-03 00:01:16
DevExpress根据条件设置GridControl RepositoryItem是否可编辑
2023-03-21 14:53:30
![](https://img.aspxhome.com/file/2023/0/92960_0s.png)
Android编程基础之简单Button事件响应综合提示控件Toast应用示例
2023-06-30 16:27:34
![](https://img.aspxhome.com/file/2023/6/137426_0s.jpg)
C#中label内容显示不全、不完整的解决方法
2022-09-13 02:43:46
java实现zip,gzip,7z,zlib格式的压缩打包
2023-08-13 08:56:59
如何使用Android注解处理器
2023-08-16 16:49:05
![](https://img.aspxhome.com/file/2023/8/139418_0s.jpg)
springboot2.X整合prometheus监控的实例讲解
2021-07-04 13:49:59
![](https://img.aspxhome.com/file/2023/2/82442_0s.jpg)
mac系统下载、安装、使用Java8教程
2023-07-06 04:54:38
![](https://img.aspxhome.com/file/2023/6/138836_0s.jpg)
Android搜索框通用版
2022-12-23 09:04:46
![](https://img.aspxhome.com/file/2023/1/139641_0s.gif)
Java中的Random()函数及两种构造方法
2023-05-12 03:00:46
C# 使用multipart form-data方式post数据到服务器
2023-12-20 21:10:58
SpringCloud分布式链路追踪组件Sleuth配置详解
2023-11-28 23:58:42
![](https://img.aspxhome.com/file/2023/6/60666_0s.png)
C#调用Java类的实现方法
2022-10-30 11:00:10
C# cmd中修改显示(显示进度变化效果)的方法
2023-11-02 13:55:34