当我启动主线程时,我也启动了第二个线程,但第二个线程仍然等待主线程.我期望当我开始一个新线程时,它将在没有连接到主线程的情况下继续工作.那么为什么panel1
在主线完成工作后变得可见?
private void comboBox1_SelectedIndexChanged_1(object sender, EventArgs e) { Thread thread = new Thread(new ThreadStart(threadUI)); thread.Start(); // This class is loading something from the server on the main thread excel.get_data_from_excel(comboBox1.SelectedItem.ToString(), this); } private void threadUI() { if (panel1.InvokeRequired) { panel1.Invoke(new newDelegate(threadUI)); } else { panel1.Visible = true; } }
Michael Gunt.. 5
Invoke
在主线程执行委托之前,该方法不会返回.如果您希望后台线程继续而不等待主线程,请BeginInvoke
改用.
但是,请注意主线程上只能发生一件事.您可以调用Invoke或BeginInvoke,但在主线程空闲之前不会处理该委托.也就是说,如果get_data_from_excel需要很长时间,panel1.Visible=true
那么在get_data_from_excel完成之前,comboBox1_SelectedIndexChanged_1将返回,并且主线程变为空闲,您将不会生效.
如果你真的想让这些东西"平行",你必须在后台线程中执行get_data_from_excel.
Invoke
在主线程执行委托之前,该方法不会返回.如果您希望后台线程继续而不等待主线程,请BeginInvoke
改用.
但是,请注意主线程上只能发生一件事.您可以调用Invoke或BeginInvoke,但在主线程空闲之前不会处理该委托.也就是说,如果get_data_from_excel需要很长时间,panel1.Visible=true
那么在get_data_from_excel完成之前,comboBox1_SelectedIndexChanged_1将返回,并且主线程变为空闲,您将不会生效.
如果你真的想让这些东西"平行",你必须在后台线程中执行get_data_from_excel.