[英]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.