应该第二个线程等待主线程

Top*_*rak 0 c# multithreading

当我启动主线程时,我也启动了第二个线程,但第二个线程仍然等待主线程.我期望当我开始一个新线程时,它将在没有连接到主线程的情况下继续工作.那么为什么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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Mic*_*ter 5

Invoke在主线程执行委托之前,该方法不会返回.如果您希望后台线程继续而不等待主线程,请BeginInvoke改用.

但是,请注意主线程上只能发生一件事.您可以调用Invoke或BeginInvoke,但在主线程空闲之前不会处理该委托.也就是说,如果get_data_from_excel需要很长时间,panel1.Visible=true那么在get_data_from_excel完成之前,comboBox1_SelectedIndexChanged_1将返回,并且主线程变为空闲,您将不会生效.

如果你真的想让这些东西"平行",你必须在后台线程中执行get_data_from_excel.

  • 这无助于他解决他的问题.使用`BeginInvoke`没有第二个线程阻塞将改变问题的一个症状而不修复根问题. (3认同)