我已经阅读了许多关于使用BackgroundWorker对象来处理执行时间密集型任务的示例,这些任务生成用于填充DataGridView的结果。但是在我的情况下,似乎填充DataGridView的行为是花费最多的时间。我想知道这是否是因为我需要格式化结果(隐藏某些列,检查每行上的某些标志以设置颜色/字体等)。
示例:
DataTable results_table;
DataGridView my_grid;
DataView my_view;
private void fillTable()
{
// Generate the results
...
// Bind the data.
my_view.Table = results_table;
my_grid.DataSource = my_view
// Format the results
my_grid.Columns[0].Visible = false;
my_grid.Columns[1].Visible = false;
my_grid.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
my_grid.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
foreach (DataGridViewRow row in my_grid.Rows)
{
// Check for flags and format necessary rows.
}
}
这是正确的方法吗,还是有其他方法来格式化结果而不必遍历每一行?
答案 0 :(得分:5)
您实际上无法执行另一个线程中的格式化,因为所有处理UI元素的操作都必须在UI线程上进行。您可以做的最好的事情是预先进行处理和决策,以便实际与GUI交互的代码尽可能简单和精简。
答案 1 :(得分:1)
我不认为多线程会帮助你在这里,因为任何与控件的交互都需要在GUI线程上发生(正如Adam指出的那样)。
上次我使用DataGridView
时,我发现我最大的表现瓶颈是使用AutoSizeMode
。不记得是否有一些特定的值是特别糟糕的,但它确实有点不同。我会尝试从那个属性开始。
答案 2 :(得分:0)
我不记得.NET是否有一个选项可以暂停屏幕更新,同时对表单控件进行一系列更改。如果是这样,那可能会加快您的UI更改。
答案 3 :(得分:0)
正如大家所提到的,您只能从GUI线程更新UI。但是,您可以做的是在单独的线程上移动创建my_view
的代码。