你能抓住RaceOnRCWCleanup例外吗?

ast*_*ght 1 c# exception visual-studio-2010

我的同事在下面写了这个代码"closeConnection()",并抛出了类型的异常:

检测到RaceOnRCWCleanup

已经尝试释放正在使用的RCW.RCW正在活动线程或另一个线程上使用.尝试释放正在使用的RCW可能会导致损坏或数据丢失.

private static void closeConnection()
    {
        if(connection != null)
        {
            try
            {
                connection.Close(); // <-- this is the problem
            }
            catch(Exception)
            {
            }

            connection = null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

由于此代码包含在try {} catch {}块中,因此我得出结论,您无法捕获此类异常.是这样的吗?

Han*_*ant 6

它不是一个例外,它是一个调试器警告.它是"托管调试助手"之一,旨在捕捉可能导致以后很难诊断问题的常见错误.所以不,你不能用try/catch来捕获它.您可以使用Debug + Exceptions,Managed Debugging Assistants,Thrown复选框将其关闭"RaceOnRCWCleanup".

可能是一个误报,但你应该担心这一点.通用诊断是connection.Close()调用导致释放COM对象.但它返回到由同一个COM对象启动的代码,通常是由于一个事件.这意味着它可能返回到COM服务器内的代码,该服务器是现在销毁的COM对象的一部分.如果这是服务器无法处理的事情,它通常会发出响亮的声音,通常是完全不可识别的AccessViolation.如果它没有爆炸并且你彻底测试了这个,那么继续并关闭警告.或者找一种方法稍后调用Close(),查看这个答案的例子.