C# DataGridView.Invoke冻结
我有一位行动代表:C# DataGridView.Invoke冻结,c#,datagridview,thread-safety,invoke,C#,Datagridview,Thread Safety,Invoke,我有一位行动代表: public static Action SubscribeForTable; 我用对象方法加载了它 public void SubscribeMe() { Parallel.For(0, ACCESS.GetAppCount(), AppCheck); CheckTable(true); } 所以我有一个委托,它包含相同的函数,但用于不同的对象 然后我会这样做: Parallel.Invoke(SubscribeForTable); 所以它开始运行,我
public static Action SubscribeForTable;
我用对象
方法加载了它
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上。为什么会这样?希望我已经正确地解释了我的问题。
控件。根据设计,Invoke
会阻止当前线程,直到UI线程能够处理消息
如果您正在从UI线程调用Parallel.For
循环,将阻塞UI线程,直到它完成
这两种情况会导致一个操作(调用调用调用)在另一个操作完成并释放UI线程之前无法完成(Parallel.For
),但第二个操作在单个工作项完成之前无法完成
如果只是更新UI,您可以使用BeginInvoke
而不是Invoke
来避免这里的死锁。这将导致实际方法(CheckTable
)在整个操作完成后运行并设置值。使用Invoke()很容易导致死锁,始终支持BeginInvoke()。此死锁是由UI线程繁忙引起的,通常等待工作线程完成。它不应该等待。使用Debug+Windows+线程进行调试。