BeginInvoke 与 Invoke 阻塞UI问题

很奇怪当我把     treeList1.Invoke((MethodInvoker)delegate

放在循环外边时 UI被阻塞了  代码执行顺序

 label1.Text = "111111111"--> GetTreeListBindings()--> MessageBox.Show("哇哈哈");

当按下面代码执行时,UI没有被阻塞

我想不阻塞UI。。还有什么办法吗?

        private void simpleButton2_Click(object sender, EventArgs e)
        {
            treeList1.ClearNodes();
            _thread = new Thread(new ThreadStart(delegate()
            {
                GetTreeListBindings();
            }));
            _thread.IsBackground = true;
            _thread.Start();


            label1.Text = "111111111";
            MessageBox.Show("哇哈哈");
    
        }

        private void GetTreeListBindings() 
        {
            DXTest01.BLL.Town_Village_Hos_Dictionary bll = new DXTest01.BLL.Town_Village_Hos_Dictionary();
            DataTable dt = new DataTable();
            DataTable dt_two = new DataTable();
            //查出父节点
            dt = bll.GetDataTable_sHosServerCode();
            //循环添加数据
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                treeList1.Invoke((MethodInvoker)delegate
                {
                    //绑定父节点
                    TreeListNode Node = treeList1.AppendNode(new object[]
                    { 
                        dt.Rows[i]["sHosServerCode"],
                        dt.Rows[i]["sHosServerName"], null, null, 
                        dt.Rows[i]["sMedComparison"]
                    }, null);
                    Node.SetValue(0, dt.Rows[i]["sHosServerCode"]);
                    //查询子节点
                    dt_two = bll.GetDataTable(dt.Rows[i]["sHosServerCode"].ToString());
                    //绑定子节点
                    for (int j = 0; j < dt_two.Rows.Count; j++)
                    {
                        this.treeList1.AppendNode
                        (new object[] 
                        {
                            dt_two.Rows[j]["sHosServerCode"],
                            dt_two.Rows[j]["sHosServerName"],
                            dt_two.Rows[j]["sVillageHosCode"],
                            dt_two.Rows[j]["sVillageHosName"],
                            dt_two.Rows[j]["sMedComparison"] 
                        }, Node);
                    }
                });
            }
        }
jeck猫
浏览 413回答 2
2回答

MMMHUHU

你自己标题里面不是写了吗?用BeginInvoke. 该方法会在线程池中自动分配线程为你的委托执行代码。 如果委托中有UI的更新,需要再次调用BeginInvoke回到主线程去更新UI状态数据。

神不在的星期二

楼上的意思是只要你修改UI,就会占用主线程,就会阻塞。所以你应该尽量减少调用UI的次数,在你的辅助线程里先把数据准备好,然后再集中的一次性把你的树控件建立出来。
打开App,查看更多内容
随时随地看视频慕课网APP