DataGridView.Invoke freezes

本文关键字:freezes Invoke DataGridView | 更新日期: 2023-09-27 18:35:40

我有一个操作委托:

public static Action SubscribeForTable;

我用我的Objects方法加载了它

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.为什么会这样?希望我已经正确解释了我的问题。

DataGridView.Invoke freezes

Control.Invoke 根据设计,会阻止当前线程,直到 UI 线程可以处理消息。

如果从 UI 线程调用 Parallel.For 循环,则会阻止 UI 线程,直到它完成。

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

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