zoukankan      html  css  js  c++  java
  • WebBrowser 当前线程不在单线程单元中的错误

    最近在开发的过程中,有一个插件用到了WebBrowser控件,以前一直是好的,转成VS2010版后,以Release模式编译竟然报错了,报的是“当前线程不在单线程单元中,因此无法实例化”的错误。但是我里面除了主线程都没有用到其他的线程啊,就是一个很普通的用法。找了半天找不也问题来,更奇怪的是,如果我换成Debug模式进行编译,它竟然又好了,而且在Debug模式编译后,再切换成Debug模式,它竟然也好了。当时找了半天没找到解决的办法,所以也就没管它了。没想到这几天这个错误又突然冒出来了,而且不管是Debug模式或者Release模式,都出现这个问题,我又在网上找了很久,都没找到可行的办法。
    在网上找资料的过程中,大致明白了为什么会出现这个错误,可能是Webbrower控件里面用到了Com的什么东西,所以必须在单线程中运行。网上有人说,在Main方法的前面加上[STAThread]属性,但是我发现的我的Main方法本身就有这个属性,但为什么还是出错呢。我在窗体中设置一个断点,查看当前线程的状态,发现虽然在Main方法前面加上了[STAThread]属性,我使用Thread.CurrentThread.GetApartmentState()得到当前线程的状态,竟然还是MTAThread,它竟然自动变换过来了。可能这也是错误的原因,但就是不知道它为什么要把我的当前线程状态变换过来,也不清楚在哪里变换的。
    最后想到了一个办法,就是把Main方法前面的[STAThread]属性去掉,不在Main方法那设置它的线程状态,在窗体的Load事件中设置当前线程的状态为Unknows,用下面的一行代码即可:Thread.CurrentThread.SetApartmentState(ApartmentState.Unknown);设置为Unkonw状态的话,那么.NET就会在程序运行的时候自动的去设置线程的状态。最后就没有出现那个错误了。
    后来其他的一些没有用到WebBrower控件的程序也出现类似的线程问题,用这种方法竟然也可以解决。但是现在有一点,就是不肯定确定这种写法会不会引起其他的一些错误,目前还不知道。
  • 相关阅读:
    thinkphp 框架的学习(1) 扩展配置文件
    【7】了解Bootstrap栅格系统基础案例(2)
    【6】了解Bootstrap栅格系统基础案例(1)
    【5】了解Bootstrap预置的栅格系统
    【4】创建一个自己的Bootstrap模板
    【3】Bootstrap的下载和目录结构
    【2】认识Bootstrap
    【1】Bootstrap入门引言
    css(html)背景图优化合并
    CSS2书写顺序
  • 原文地址:https://www.cnblogs.com/xiaoxiangfeizi/p/2758132.html
Copyright © 2011-2022 走看看