DataGridView.Invoke freezes
本文关键字:freezes Invoke DataGridView | 更新日期: 2023-09-27 18:35:40
我有一个操作委托:
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
)运行并在整个操作完成后设置值。