簡體   English   中英

DataGridView.Invoke凍結

[英]DataGridView.Invoke freezes

我有一個動作代表:

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 為什么這樣? 希望我已經正確解釋了我的問題。

根據設計, Control.Invoke阻止當前線程,直到UI線程可以處理消息為止。

如果要從UI線程調用Parallel.For循環,則會阻塞UI線程,直到完成。

兩者導致一種情況,其中一個操作( Invoke調用)要等到另一個操作完成並釋放UI線程( Parallel.For )后才能完成,而第二個操作要等到各個工作項完成后才能完成。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM