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

 卫宇欢试试 发布于 2023-02-05 09:39

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

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

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

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

    2023-02-05 09:43 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有