2013-02-15 114 views
0

我有一个窗体(complexForm在代码中)与多个控件,需要一些时间来加载。所以我决定放入一个单独的线程,以减少初始加载时间。除了等待表单上的标签控件(代码中的Form1)一开始不会显示,一切正常;在Form1出发之前只需要一秒钟的时间。所以我的问题是,为什么不显示标签控制?控件不显示,如果运行在后台线程(c#winform)

[STAThread] 
static void Main() 
{ 
    Thread thread = new Thread(delegate() 
    { 
     var wait = new Form1(); //simple form with a label control with text "please wait" 
     wait.Show(); 
     var complexUI = new complexForm();// this takes long time to load 
     wait.Dispose();// it will go off even without this method 
     // MessageBox.Show("loaded"); 
    }); 

    thread.SetApartmentState(ApartmentState.STA); 
    thread.Priority = ThreadPriority.Highest; 
    thread.IsBackground = true; 
    thread.Start(); 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new main()); 

} 
+0

如果您使用多个'thread',为什么要将'ApartmentState'设置为单线程('[STAThread]'和'ApartmentState.STA')? – Brian 2013-02-15 16:35:13

+0

你想实现什么? 'var complexUI = new complexForm(); //这需要很长时间才能加载'在complexForm构造函数中执行什么操作会导致长时间加载? – 2013-02-15 16:37:00

+0

实际上,我有DevExpress richeditcontrols在其中需要很长时间才能加载的ribbonbar。请参阅此URL http://www.devexpress.com/Support/Center/p/Q406398.aspx – user1746821 2013-02-15 16:42:43

回答

1

不要这样做。它会流下眼泪。只有从UI线程创建UI控件 - 这是拥有消息泵的线程,这对正确操作至关重要。

正确的解决方案是创建一个启动屏幕,当您的主窗口正在初始化时显示。

关于如何创建启动画面,Stack Overflow上有相当多的线程。

+0

我知道启动画面的方法。只是好奇这个线程http://www.devexpress.com/Support/Center/p/Q406398.aspx – user1746821 2013-02-15 16:44:17