C# DataGridView.Invoke冻结

C# DataGridView.Invoke冻结,c#,datagridview,thread-safety,invoke,C#,Datagridview,Thread Safety,Invoke,我有一位行动代表: public static Action SubscribeForTable; 我用对象方法加载了它 public void SubscribeMe() { Parallel.For(0, ACCESS.GetAppCount(), AppCheck); CheckTable(true); } 所以我有一个委托,它包含相同的函数,但用于不同的对象 然后我会这样做: Parallel.Invoke(SubscribeForTable); 所以它开始运行,我

我有一位行动代表:

public static Action SubscribeForTable;
我用
对象
方法加载了它

public void SubscribeMe()
{
    Parallel.For(0, ACCESS.GetAppCount(), AppCheck);
    CheckTable(true);
}
所以我有一个委托,它包含相同的函数,但用于不同的对象

然后我会这样做:

Parallel.Invoke(SubscribeForTable);
所以它开始运行,我等待…我等待…什么也没发生!应用程序被卡住了!然后我启动了我的调试器

返回
SubscribeMe()
函数

Parallel.For(0, ACCESS.GetAppCount(), AppCheck); //OK
CheckTable(true);  // lets see what is in
然后我看了看这个函数

delegate void CheckTableCallback(bool check);

private void CheckTable(bool Subscribed)
{
    if (DataGridView1.InvokeRequired) // OK
    {
        CheckTableCallback Safe = new CheckTableCallback(CheckTable);  // OK
        DataGridView1.Invoke(Safe, new Object[] {Subscribed}); //HANGS HERE!
    }
    else
    {
        ....

因此它挂起在DataGridView.Invoke上。为什么会这样?希望我已经正确地解释了我的问题。

控件。根据设计,Invoke
会阻止当前线程,直到UI线程能够处理消息

如果您正在从UI线程调用
Parallel.For
循环,将阻塞UI线程,直到它完成

这两种情况会导致一个操作(调用
调用
调用)在另一个操作完成并释放UI线程之前无法完成(
Parallel.For
),但第二个操作在单个工作项完成之前无法完成

如果只是更新UI,您可以使用
BeginInvoke
而不是
Invoke
来避免这里的死锁。这将导致实际方法(
CheckTable
)在整个操作完成后运行并设置值。

使用Invoke()很容易导致死锁,始终支持BeginInvoke()。此死锁是由UI线程繁忙引起的,通常等待工作线程完成。它不应该等待。使用Debug+Windows+线程进行调试。