为了账号安全,请及时绑定邮箱和手机立即绑定

BeginInvoke 与 Invoke 阻塞UI问题

BeginInvoke 与 Invoke 阻塞UI问题

jeck猫 2018-12-06 19:16:43
很奇怪当我把     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); } }); } }
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

你自己标题里面不是写了吗?用BeginInvoke.

该方法会在线程池中自动分配线程为你的委托执行代码。

如果委托中有UI的更新,需要再次调用BeginInvoke回到主线程去更新UI状态数据。

查看完整回答
反对 回复 2019-01-21
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

楼上的意思是只要你修改UI,就会占用主线程,就会阻塞。所以你应该尽量减少调用UI的次数,在你的辅助线程里先把数据准备好,然后再集中的一次性把你的树控件建立出来。

查看完整回答
反对 回复 2019-01-21
  • 2 回答
  • 0 关注
  • 412 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信