//定义委托省略//开始线程
ThreadGetIteams = new Thread(new ThreadStart(this.isInvoke));
ThreadGetIteams.Start();//判断UI
private void isInvoke()
        {
            if (!dataGridView1.InvokeRequired)//如果在UI主线程操作dataGridView1,
            {
                dataGridView1.Refresh();//则直接进行控件操作,“与UI主线程相关联”
            }
            else//如果是在另一线程操作dataGridView1,则启用委托
            {
                dataGridView1.Invoke(new deleRefreshDataGridView(getIteams));
            }
        }
private void getIteams()
{
      //得到Iteams集合,约万余条记录略      
      //定义容器
      List<string[]> IteamsList = new List<string[]>();      while (Iteams总数)
            {
               IteamsList .Add(Iteams集合.GetValue(2).ToString().Split('_'));
            }      //后面省略
}
单步调试跟踪了一下,运行到while循环处最花时间,且UI主线程会无响应,卡几秒钟。
如何才能不卡?如果放个进度条的话,进度条的操作放在哪里?

解决方案 »

  1.   

    具体地给你写demo代码就是:private void isInvoke()
            {
                var datas=进行计算得到所有结果数据();   //这里需要花90%的时间
                dataGridView1.Invoke(new deleRefreshDataGridView(getIteams), datas);  //datas作为getIteams的参数
            }
      

  2.   

    引用 2 楼 sp1234 的回复:
    引用楼主 sgbaobao 的回复:
    if (!dataGridView1.InvokeRequired)//如果在UI主线程操作dataGridView1,
    {
    dataGridView1.Refresh();//则直接进行控件操作,“与UI主线程相关联”
    }
    else//如果是在另一线程操作dataGridView1,则启用委托
    {
    dataGridView1.Invoke(ne……
    呵呵,大虾真风趣
      

  3.   

    我的建议是在你进行数据库操作的时候,ui提示一个进度条,提醒用户正在查询,等你后台查询完毕后再更新ui界面的数据并将进度条关掉你可以尝试在.net2.0中的BackgroundWorker,封装的比较好,可以非常简单的提供进度,撤销等操作
      

  4.   


    我的线程里没有做大量操作控件的事情,只是刷新了一个dataGridView。即使不用这样的判断,直接调用dataGridView1.Invoke(new deleRefreshDataGridView(getIteams));
    也会在while地方卡一会。
      

  5.   

    难道说,dataGridView1.Invoke(new deleRefreshDataGridView(getIteams));
    这一句相当于把线程又交回去了?