尝试使用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
});
答案 0 :(得分:2)
控件只能在创建它们的线程中访问(并且只有一个UI线程)。如果您的调用来自另一个线程(由于您位于Parallel.For
中,它会执行此操作),您必须使用Invoke
方法和实际方法的委托。要测试您是否处于“错误”线程,可以使用InvokeRequired
属性。
if (dgDisplay.InvokeRequired)
{
dgDisplay.Invoke(addColumnDelegate, columnDataGridTextBox);
}
else
{
dgDisplay.Columns.Add(columnDataGridTextBox);
}
当您从表单的事件处理程序中调用此代码时,它将阻塞,因为Invoke
方法将同步执行。您必须使用BeginInvoke
而不是Invoke
来异步执行它。
除此之外,我不会在这里使用Parallel.For
有两个原因:
Parallel.For
中,您无法预测元素的计算顺序。如果列顺序无关紧要,并且您认为应该并行执行列的创建,我建议在DataGridViewColumn
中构建一个Parallel.For
对象数组,然后将它们分配给使用dgDisplay.Columns.AddRange(columns)
进行控制。