【发布时间】:2014-10-06 22:23:50
【问题描述】:
我正在尝试并行化我的代码以使其运行得更快。到目前为止,都是头疼的问题,没有结果。
我想同时更新几个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(...)”创建的线程此时卡住了:
- mscorlib.dll!System.Threading.WaitHandle.InternalWaitOne(System.Runtime.InteropServices.SafeHandle waitableSafeHandle, long millisecondsTimeout, bool hasThreadAffinity, bool exitContext)
- mscorlib.dll!System.Threading.WaitHandle.WaitOne(int 毫秒超时,布尔 退出上下文)
- System.Windows.Forms.dll!System.Windows.Forms.Control.WaitForWaitHandle(System.Threading.WaitHandle 等待句柄)
- System.Windows.Forms.dll!System.Windows.Forms.Control.MarshaledInvoke(System.Windows.Forms.Control 调用者,System.Delegate 方法,object[] args,bool 同步)
- System.Windows.Forms.dll!System.Windows.Forms.Control.Invoke(System.Delegate 方法,对象[] 参数)
- 等
他们为什么卡住了?
【问题讨论】: