分享我在工作中遇到的多线程下导致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,释放
0
投稿

猜你喜欢

  • java基础检查和未检查异常处理详解

    2023-10-25 11:10:25
  • Java中CyclicBarrier和CountDownLatch的用法与区别

    2021-09-09 08:20:01
  • 一款非常简单酷炫的LoadingView动画效果

    2021-11-09 11:49:08
  • Java中用enum结合testng实现数据驱动的方法示例

    2021-08-04 07:44:21
  • 浅谈Java多进程程序的运行模式

    2021-07-06 11:06:49
  • 19款Javascript富文本网页编辑器

    2021-12-08 23:48:45
  • Java使用openOffice对于word的转换及遇到的问题解决

    2021-12-03 00:01:16
  • DevExpress根据条件设置GridControl RepositoryItem是否可编辑

    2023-03-21 14:53:30
  • Android编程基础之简单Button事件响应综合提示控件Toast应用示例

    2023-06-30 16:27:34
  • 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
  • springboot2.X整合prometheus监控的实例讲解

    2021-07-04 13:49:59
  • mac系统下载、安装、使用Java8教程

    2023-07-06 04:54:38
  • Android搜索框通用版

    2022-12-23 09:04:46
  • 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
  • C#调用Java类的实现方法

    2022-10-30 11:00:10
  • C# cmd中修改显示(显示进度变化效果)的方法

    2023-11-02 13:55:34
  • asp之家 软件编程 m.aspxhome.com