2013-10-15 42 views
1

我有一個Action委託:DataGridView.Invoke凍結

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

使用Invoke()容易導致死鎖,總是有利於BeginInvoke()。這種死鎖是由UI線程繁忙導致的,通常等待工作線程完成。它不應該等待。使用Debug + Windows +線程進行調試。 –

回答

2

Control.Invoke按設計阻塞當前線程,直到UI線程可以處理消息。

如果您從UI線程調用Parallel.For循環,那麼將阻塞UI線程直到它完成。

兩個原因,其中一個操作(Invoke調用)無法完成,直到其他完成免費的了UI線程(Parallel.For),但第二個無法完成,直到各個工作項目完成的條件。

如果您只是更新UI,則可以使用BeginInvoke而不是Invoke來避免死鎖。這將導致實際方法(CheckTable)運行並在之後設置值整個操作完成。

+0

好像是'BeginInvoke'的作品,謝謝! –