日期:2014-05-19  浏览次数:20740 次

为什么不能用异步线程创建带自定义组件的FORM?
通过异步线程创建一个什么都不带的FORM时,是没有问题的。但是我自己封装了一个通讯组件,把这个组件放在FORM上,通过异步线程去创建时就出错了:当前线程不在单线程单元中,无法实例化ActiveX控件。

主窗体源码:
                private   void   button1_Click(object   sender,   EventArgs   e)
                {
                        Thread   t   =   new   Thread(new   ThreadStart(Open));

                        t.Start();
                }

                private   void   Open()
                {
                        Form2   f2   =   new   Form2();
                        f2.ShowDialog();
                }

被创建窗体的源码:
this.communicationToolBar1   =   new   EntlogicCommunicationClient.CommunicationToolBar();
communicationToolBar1   就是自定义的组件,上述语句就提示错误了

------解决方案--------------------
线程安全问题吧
------解决方案--------------------
通过非UI线程来创建UI元素本来就不合法呀
------解决方案--------------------
用Invoke来创建窗体。
------解决方案--------------------
显示UI的话,用单线程模型,加这样一句话应该就可以了。
t.ApartmentState = System.Threading.ApartmentState.STA;