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控件的程序也出现类似的线程问题,用这种方法竟然也可以解决。但是现在有一点,就是不肯定确定这种写法会不会引起其他的一些错误,目前还不知道。
原文地址:https://www.cnblogs.com/xiaoxiangfeizi/p/2758132.html