簡體   English   中英

使用多線程C#將許多行插入DatagridView?

[英]Insert many row to DatagridView using Multiple threads C#?

我正在從網站上執行廢品程序。 我有很多線程可以將信息更新到datagridview。 我正在使用數據集將綁定源設置為datagridview。 當我插入約10萬行時。 我的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 { }       
}));  }

你們能幫我嗎? 我對它迷惑了許多小時。 提前致謝。

您正在做的是在UI線程上調用該代碼。 這是一個循環,可能會迭代許多行。 這可能會花費很長時間,並阻止UI線程執行任何其他操作。 您可以嘗試將工作分解為較小(或固定大小)的塊並分別調用它們-這將允許UI線程在其間處理其他消息。

或者,您可以在Application.Idle事件中完成工作; 但是,您可能仍需要將工作分解成固定大小的塊,因為在Idle事件中您應該只花很少的時間,最好是固定的時間。

我認為這里的問題是您沒有鎖定上面的代碼,並且所有線程同時訪問了所有代碼。

您需要使用:-

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/zh-cn/library/c5kehkcz(v=vs.71).aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM