Control.Invoke方法没有返回

Pie*_*din 0 c# .net-4.0

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

我想同时更新几个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(...)"创建的线程在此时陷入困境:

  • 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方法,object [] args)
  • 等等

他们为什么被困?

Jon*_*eet 6

我假设你是Parallel.Invoke从UI线程调用的.如果是这样,那就是问题所在.

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

可以通过使用BeginInvoke而不是Invoke(并且您可能想要这样做)来解决这个问题,但是Parallel.Invoke在UI线程中使用它基本上是一个坏主意,正是因为它阻塞了.