分享我在工作中遇到的多线程下导致RCW无法释放的问题

 更新时间:2015年12月09日 09:24:56   作者:眼神与背影  
最近在做项目中遇到一个问题,在调用一个类库中的方法时,出现如下异常信息:尝试释放正在使用的RCW,活动线程或其他线程上正在使用该 RCW,释放正在使用的 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#隐藏手机号、邮箱等敏感信息的实现方法的相关资料,需要的朋友可以参考下
    2016-09-09
  • C#中紧耦合Tight Coupling和松耦合Loose Coupling的实现

    C#中紧耦合Tight Coupling和松耦合Loose Coupling的实现

    紧耦合和松耦合是描述模块或组件之间耦合程度的两个概念,本文主要介绍了C#中紧耦合Tight Coupling和松耦合Loose Coupling的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • C#遍历删除字符串中重复字符

    C#遍历删除字符串中重复字符

    这篇文章主要介绍了C#遍历删除字符串中重复字符的方法,涉及C#遍历字符串的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#常见Winform窗体效果详解

    C#常见Winform窗体效果详解

    这篇文章主要为大家详细介绍了C#中常见Winform窗体效果实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • c# WPF如何实现滚动显示的TextBlock

    c# WPF如何实现滚动显示的TextBlock

    这篇文章主要介绍了c# WPF如何实现滚动显示的TextBlock,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • Unity Shader实现素描效果

    Unity Shader实现素描效果

    这篇文章主要为大家详细介绍了Unity Shader实现素描效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#实现基于加减按钮形式控制系统音量及静音的方法

    C#实现基于加减按钮形式控制系统音量及静音的方法

    这篇文章主要介绍了C#实现基于加减按钮形式控制系统音量及静音的方法,涉及C#引用user32.dll动态链接库操作系统音量的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • C#线程中弹窗的制作方法

    C#线程中弹窗的制作方法

    这篇文章主要为大家详细介绍了C#线程中弹窗的制作方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C#实现的鼠标钩子

    C#实现的鼠标钩子

    本文给大家分享的是使用C#实现鼠标钩子功能,程序已能获取鼠标坐标,其他就没别的功能了,有需要的小伙伴参考下吧。
    2015-03-03
  • C# 并行和多线程编程——Task进阶知识

    C# 并行和多线程编程——Task进阶知识

    这篇文章主要介绍了C# 并行和多线程编程——Task进阶知识的的相关资料,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-02-02

最新评论