我正在尝试并行化我的代码以使其运行得更快.到目前为止,一直都是头痛而且没有结果.
我想同时更新几个DataGridViews:
Parallel.Invoke(
() => updateDgv1(),
() => updateDgv2(),
() => updateDgv3()
);
Run Code Online (Sandbox Code Playgroud)
我尝试过使用网上随处可见的简单(但可能不是最佳)方式(例如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;
}
}
Run Code Online (Sandbox Code Playgroud)
主线程陷入"Parallel.Invoke(...)"调用,等待其他线程完成.
由"Parallel.Invoke(...)"创建的线程在此时陷入困境:
他们为什么被困?
我假设你是Parallel.Invoke从UI线程调用的.如果是这样,那就是问题所在.
Parallel.Invoke阻止所有调用完成...这意味着你阻止了UI线程.您启动的任务无法完成,因为Control.Invoke阻塞直到UI线程上的调用完成 - 因此您的子任务正在等待UI线程变为可用以更新UI,但您的UI线程正在等待所有子任务完成.
您可以通过使用BeginInvoke而不是Invoke(并且您可能想要这样做)来解决这个问题,但是Parallel.Invoke在UI线程中使用它基本上是一个坏主意,正是因为它阻塞了.