当前位置: 首页 > news >正文

工作中遇到的一个多线程下导致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进程关不掉。于是就将这里的对象实例化放到了线程方法中,这样在方法执行结束后,堆中的对象就处于无引用状态,在垃圾回收时就被释放了,问题就自然解决了。其实这里跟单线程还是多线程没关系,主要是在全局范围内进行实例化导致了对象不能被垃圾回收,所以在写代码的时候一定要注意对象的生命周期。

转载于:https://www.cnblogs.com/neverstop/p/5030719.html

相关文章:

  • Android实例-拨打电话
  • 博弈SG函数
  • Android实例-发送信息
  • 利用jQuery实现鼠标滑过整行变色
  • Android项目之无线点餐(1)--点餐系统数据库设计
  • HDU 4757 Tree 可持久化字典树
  • Android项目之无线点餐(2)--用户登录的客户端和服务器端实现
  • 千变万化的ViewPager切换动画(1)--仅支持3.0以上版本的官方方法
  • Canopy聚类算法与Mahout中的实现
  • Android基础学习—下载并在Eclipse中关联Android源码
  • 【html】【11】函数名称约束规范
  • 千变万化的ViewPager切换动画(2)--自定义ViewPager的实现方法
  • 二叉树习题之重建二叉树
  • WebView的简单入门
  • 持续集成
  • Google 是如何开发 Web 框架的
  • [Vue CLI 3] 配置解析之 css.extract
  • Android组件 - 收藏集 - 掘金
  • avalon2.2的VM生成过程
  • eclipse(luna)创建web工程
  • Flannel解读
  • GitUp, 你不可错过的秀外慧中的git工具
  • happypack两次报错的问题
  • java中具有继承关系的类及其对象初始化顺序
  • php ci框架整合银盛支付
  • springMvc学习笔记(2)
  • uva 10370 Above Average
  • Vue官网教程学习过程中值得记录的一些事情
  • yii2权限控制rbac之rule详细讲解
  • 阿里云Kubernetes容器服务上体验Knative
  • 初识 webpack
  • 多线程 start 和 run 方法到底有什么区别?
  • 使用 QuickBI 搭建酷炫可视化分析
  • 延迟脚本的方式
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 在Unity中实现一个简单的消息管理器
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #14vue3生成表单并跳转到外部地址的方式
  • #define 用法
  • #vue3 实现前端下载excel文件模板功能
  • $$$$GB2312-80区位编码表$$$$
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (学习日记)2024.01.09
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET Core 项目指定SDK版本
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表