我正在尝试并行化我的代码以使其运行得更快。到目前为止,一直都是头痛而且没有结果。
我想同时更新几个DataGridView:
Parallel.Invoke(
() => updateDgv1(),
() => updateDgv2(),
() => updateDgv3()
);
我尝试过使用网上各处推荐的简单(但可能不是最佳)方式(例如此处http://msdn.microsoft.com/en-us/library/ms171728(v=vs.85).aspx)。
private void updateDgv1() {
/* some stuff */
assignValue(this.dgv1, colPos, rowPos, value); /* in a loop */
}
delegate void AssigneValueCallback(DataGridView dgv, int columnPos, int rowPos, string valeur);
public void assignValue(DataGridView dgv, Form form, int columnPos, int rowPos, string value)
{
if (dgv.InvokeRequired)
{
AssigneValueCallbackd = new AssigneValueCallback(assignValue);
dgv.Invoke(d, new object[] { dgv, columnPos, rowPos, value });
}
else
{
dgv[columnPos, rowPos].Value = value;
}
}
主线程陷入“Parallel.Invoke(...)”调用,等待其他线程完成。
“Parallel.Invoke(...)”创建的线程在此时陷入困境:
为什么会被卡住?
答案 0 :(得分:6)
我假设您正在从UI线程调用Parallel.Invoke
。如果是这样,那就是问题。
Parallel.Invoke
阻塞,直到所有调用完成...这意味着您正在阻止UI线程。您正在完成的任务无法完成,因为Control.Invoke
会阻塞,直到UI线程上的调用完成为止 - 因此您的子任务正在等待UI线程变为可用,以便更新UI,但您的UI线程正在等待所有子任务完成。
可以使用BeginInvoke
代替Invoke
来解决此问题(无论如何你可能想要这样做)但使用{{1>从根本上说这是一个坏主意在UI线程中,正是因为它阻塞了。