DataGridView.Invoke冻结

时间:2013-10-15 17:13:00

标签: c# datagridview thread-safety invoke

我有一个Action委托:

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上。为什么这样?希望我能正确解释我的问题。

1 个答案:

答案 0 :(得分:2)

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

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

这两个导致一个操作(Invoke调用)无法完成直到另一个操作完成且释放UI线程(Parallel.For)的情况,但是第二个操作直到个人工作项目完成。

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