Control.Invoke方法没有返回

时间:2014-10-06 14:02:42

标签: c# .net-4.0

我正在尝试并行化我的代码以使其运行得更快。到目前为止,一直都是头痛而且没有结果。

我想同时更新几个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 millisecondsTimeout,bool exitContext)
  • System.Windows.Forms.dll中!System.Windows.Forms.Control.WaitForWaitHandle(System.Threading.WaitHandle 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 方法,对象[] args)

为什么会被卡住?

1 个答案:

答案 0 :(得分:6)

我假设您正在从UI线程调用Parallel.Invoke。如果是这样,那就是问题。

Parallel.Invoke阻塞,直到所有调用完成...这意味着您正在阻止UI线程。您正在完成的任务无法完成,因为Control.Invoke会阻塞,直到UI线程上的调用完成为止 - 因此您的子任务正在等待UI线程变为可用,以便更新UI,但您的UI线程正在等待所有子任务完成。

可以使用BeginInvoke代替Invoke来解决此问题(无论如何你可能想要这样做)但使用{{1>从根本上说这是一个坏主意在UI线程中,正是因为它阻塞了。