VS2008,.NET 2,VB.NET,XP ...

我有一个Windows形式,具有web浏览器控件和关闭按钮,这只是做一个Me.Close。窗体的取消按钮被设置为关闭按钮,使得我打ESC关闭形式。

我设置在加载事件的web浏览器控件的DocumentText属性和HTML显示。

运行从Visual Studio中的应用,如果我点击关闭按钮,形式没有错误关闭。

如果我打的ESC键,我得到

  

检测RaceOnRCWCleanup   消息:已经尝试到做   释放的RCW正在使用中。该RCW   在使用活动线程上或   另一个线程。试图释放一个   在使用RCW可能会导致损坏或   数据丢失。

如果我运行VS外部应用程序,我没有错误。

任何想法一)为何错误,和b)如何防止或制止它?

预先非常感谢。

有帮助吗?

解决方案

这不是错误,它是一个警告。由托管调试助手(MDA),扩展到调试托管代码,即认为它看到的东西在你的代码去错了生产。鞋合脚。您正在使用的RCW,web浏览器是一个COM控件。你是杀死了RCW,你关闭你的表格。 MDA的步骤,因为它认为它是看到所使用的网络浏览器,并在完成请求之前就得到杀害。如果你在你的代码中使用一个线程,通常才有意义。

您?如果没有,也不会失去任何睡眠超过它。 COM使用引用计数,臭名昭著不能够解决循环引用。


好,我知道了这个摄制,由评论启用。是的,这是由窗体的CancelButton属性或按钮的DialogResult属性触发。这种情况发生在WB具有焦点,它看到Escape键按下。该ActiveX管道的一部分,是它告诉容器,所以它可以到应该有一个副作用按键响应。快捷键,Tab键,Enter键。脱逃的。如果按钮然后关闭形式中,调试器看到WB同时有从堆栈上的RCW代码活性堆栈帧得到设置。危险的是,这可能导致系统崩溃时,由于COM组件调用的代码返回得到释放,这种情况并不少见。

见此崩溃是件不可思议的事,但我可以想像,当终结器线程只是按钮的Click事件返回前运行,这可能轰炸。对于MDA和潜在的崩溃的解决方法是延迟关闭窗体,直到ActiveX代码停止运行后。与Control.BeginInvoke优雅()完成。像这样:

    private void CancelButton_Click(object sender, EventArgs e) {
        this.BeginInvoke((MethodInvoker)delegate { this.Close(); });
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top