none
多线程操作datagridview 造成假死 RRS feed

  • 问题

  • private delegate void SetGVDel(string u,string p);
        private void setgv(string u, string p)
        {
          if (gv1.InvokeRequired)
          {
            SetGVDel del = new SetGVDel(setgv);
            //gv1.Invoke(del, new object[] { u, p });
            this.Invoke(del, new object[] { u, p });
          }
          else
          {
          
          int rowid = gv1.Rows.Add();
          gv1.Rows[rowid].Cells["ID"].Value = rowid;
          gv1.Rows[rowid].Cells["账户"].Value = u;
          gv1.Rows[rowid].Cells["密码"].Value = p;
          if ((rowid - 10) > 0)
            gv1.FirstDisplayedScrollingRowIndex = (rowid - 10);
          
          }
        }
    
    我写的委托方法就是这上面这些,我如果1个线程调用它没用问题,如果10几个线程一起掉跑的话就假死。
    2011年5月9日 5:44

答案

  • 是的。被 Hang 住的原因是 this.Invoke 是 UI 线程同步方法,不是异步方法。所以它必定会阻塞 UI 线程导致 Hang。试图用 this.BeginInvoke 取代 this.Invoke 可能可以解决问题。


    Mark Zhou
    2011年5月9日 6:44

全部回复

  • 是的。被 Hang 住的原因是 this.Invoke 是 UI 线程同步方法,不是异步方法。所以它必定会阻塞 UI 线程导致 Hang。试图用 this.BeginInvoke 取代 this.Invoke 可能可以解决问题。


    Mark Zhou
    2011年5月9日 6:44
  • 我改成BeginInvoke 确实不卡了,但不知道为什么,明明是插入20000条数据,结果只有3千条插入进去了。

    2011年5月9日 8:15