0

我正在做网站上的报废程序。我有很多线程可以将信息更新到 datagridview。我正在使用数据集将绑定源设置为 datagridview。当我插入大约 100k 行时。我的 GUI 程序显示“无响应”。我不知道如何解决它。这是我要插入的代表:

public void InsertLine(string line)
{
  this.MyDV.BeginInvoke(new MethodInvoker(delegate()
  {                 
    string[] park = Regex.Split(line, @",");
    try
    {
        //Insert new row
        MyDatasset.MyTableRow row = this.MyDataSet.MyTable.NewMyTableRow();
        row.Message = park[0].Trim();
        row.From = park[1].Trim();              
        this.MyDataSet.MyTable.Rows.Add(row);

        //Set color text for new row
        DataGridViewRow myrow = (from DataGridViewRow r in MyDV.Rows
                                 where (long)r.Cells[clId.Name].Value == row.Id
                                 select r).FirstOrDefault();
        if (myrow != null)
        {
            myrow.Cells[clFrom.Name].Style.ForeColor = Color.Blue;
            myrow.Cells[clMessage.Name].Style.ForeColor = Color.Blue;
        }       
    }
    catch { }
    try
    {
        this.MyDV.FirstDisplayedScrollingRowIndex = this.MyDV.Rows[this.MyDV.Rows.Count - 2].Index; //Scroll to lastest row
    }
    catch { }       
}));  }

你们能帮帮我吗?我被它弄糊涂了好几个小时。提前致谢。

4

2 回答 2

1

您正在做的是在 UI 线程上调用该代码。这是一个可能迭代许多行的循环。这可能需要很长时间并阻止 UI 线程执行任何其他操作。您可以尝试将工作分解为更小(或固定大小)的块并单独调用它们——这将允许 UI 线程处理其间的其他消息。

或者,您可以在Application.Idle活动中完成工作;但是,您可能仍然需要将工作分解为固定大小的块,因为您应该只花费一小部分(理想情况下是固定的)时间Idle

于 2012-08-08T14:58:41.887 回答
-1

我认为您在这里遇到的问题是您没有锁定上面的代码,并且它被多个线程同时访问。

您需要使用:-

Lock (this)

{

this.MyDV.BeginInvoke(new MethodInvoker(delegate()
  {                 
    string[] park = Regex.Split(line, @",");
    try
    {
        //Insert new row
        MyDatasset.MyTableRow row = this.MyDataSet.MyTable.NewMyTableRow();
        row.Message = park[0].Trim();
        row.From = park[1].Trim();              
        this.MyDataSet.MyTable.Rows.Add(row);

        //Set color text for new row
        DataGridViewRow myrow = (from DataGridViewRow r in MyDV.Rows
                                 where (long)r.Cells[clId.Name].Value == row.Id
                                 select r).FirstOrDefault();
        if (myrow != null)
        {
            myrow.Cells[clFrom.Name].Style.ForeColor = Color.Blue;
            myrow.Cells[clMessage.Name].Style.ForeColor = Color.Blue;
        }       
    }
    catch { }
    try
    {
        this.MyDV.FirstDisplayedScrollingRowIndex = this.MyDV.Rows[this.MyDV.Rows.Count - 2].Index; //Scroll to lastest row
    }
    catch { }       
}));  }

}

这应该使每个线程依次等待使用您的插入委托。

另请查看:- http://msdn.microsoft.com/en-us/library/c5kehkcz(v=vs.71).aspx

于 2012-08-08T13:17:19.133 回答