0

Parallel.Forを使用しようとするとエラーが発生します

for (int i = 0; i <= count; i++)
{
  DataGridViewTextBoxColumn columnDataGridTextBox = new DataGridViewTextBoxColumn();
  columnDataGridTextBox.Name = fileDataField[i];
  columnDataGridTextBox.HeaderText = fileDataField[i];
  columnDataGridTextBox.Width = 120;
  dgDisplay.Columns.Add(columnDataGridTextBox);
}

paraller.forを使用した私のコード

Parallel.For(0, count, i =>
{
  DataGridViewTextBoxColumn columnDataGridTextBox = new DataGridViewTextBoxColumn();
  columnDataGridTextBox.Name = fileDataField[i];
  columnDataGridTextBox.HeaderText = fileDataField[i];
  columnDataGridTextBox.Width = 120;
  dgDisplay.Columns.Add(columnDataGridTextBox); <<< this error add colums
});
4

1 に答える 1

2

コントロールは、それを作成したスレッドでのみアクセスできます (UI スレッドは 1 つしかありません)。呼び出しが別のスレッドからのものである場合 ( にいるため) 、実際のメソッドへのデリゲートをParallel.For使用してメソッドを使用する必要があります。Invoke「間違った」スレッドにいるかどうかをテストするには、InvokeRequiredプロパティを使用できます。

if (dgDisplay.InvokeRequired)
{
    dgDisplay.Invoke(addColumnDelegate, columnDataGridTextBox);
}
else
{
    dgDisplay.Columns.Add(columnDataGridTextBox);
}

フォームのイベント ハンドラー内からこのコードを呼び出すと、Invokeメソッドが同期的に実行されるため、ブロックされます。非同期で実行するBeginInvoke代わりに使用する必要があります。Invoke

それとは別に、Parallel.Forここでは 2 つの理由で使用しません。

  1. 要素が計算される順序を予測するParallel.Forことはできません。
  2. すべての呼び出しが同じスレッドで終了するため、並列実行には何のメリットもありません。

列の順序が重要ではなく、列の作成を並行して実行する必要があると思われる場合は、 でDataGridViewColumnオブジェクトの配列を作成Parallel.Forし、 を使用してそれらをコントロールに割り当てることをお勧めしdgDisplay.Columns.AddRange(columns)ます。

于 2012-07-21T15:49:17.970 に答える