[英]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.