1

我有一个动作代表:

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

4

1 回答 1

2

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

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

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

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

于 2013-10-15T17:17:40.090 回答