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 线程)。如果您的调用来自另一个线程(因为您在 a 中,它确实如此Parallel.For),您必须将该Invoke方法与实际方法的委托一起使用。要测试您是否在“错误”线程中,您可以使用该InvokeRequired属性。

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

当您从表单的事件处理程序内部调用此代码时,它将阻塞,因为该Invoke方法将同步执行。您必须使用BeginInvoke而不是Invoke异步执行它。

除此之外,我不会Parallel.For在这里使用,原因有两个:

  1. Parallel.For您无法预测计算元素的顺序。
  2. 由于所有调用都将在同一个线程中结束,因此并行执行不会带来任何好处。

如果列顺序无关紧要,并且您认为 Columns 的创建应该并行执行,我建议在 中构建一个DataGridViewColumn对象数组,Parallel.For然后使用dgDisplay.Columns.AddRange(columns).

于 2012-07-21T15:49:17.970 回答