我試圖並行化我的代碼以使其運行速度更快。到目前爲止,這一直都令人頭痛,沒有結果。Control.Invoke方法不返回
我想在同一時間更新幾個DataGridViews:
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,長millisecondsTimeout,布爾hasThreadAffinity, 布爾exitContext)
- mscorlib.dll中!System.Threading.WaitHandle.WaitOne(INT millisecondsTimeout,布爾 exitContext)
- System.Windows.Forms.dll的!System.Windows。形式.Control.WaitForWaitHandle(System.Threading.WaitHandle WaitHandle的)
- System.Windows.Forms.dll中!System.Windows.Forms.Control.MarshaledInvoke(System.Windows.Forms.Control的 呼叫者,System.Delegate方法,對象[]指定參數時,布爾同步)
- System.Windows.Forms.dll中!System.Windows.Forms.Control.Invoke(System.Delegate 方法,對象[]參數)
- 等
爲什麼他們卡住了嗎?
會System.Threading.Tasks.Task.Run(Action)的工作,還是我會遇到同樣的問題? – 2014-10-06 14:28:37
@PierreGardin yes只要您不在UI線程中等待它,Task.Run(Action)就會工作。 – Letseatlunch 2014-10-06 14:38:28
@PierreGardin:可以,因爲調用Task.Run不會阻塞等待任務完成。 – 2014-10-06 14:53:02