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 に答える