我有一个Action委托:
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
上。为什么这样?希望我能正确解释我的问题。
答案 0 :(得分:2)
Control.Invoke
按设计阻止当前线程,直到UI线程可以处理消息。
如果您从UI线程调用Parallel.For
循环,则会阻止UI线程直到完成。
这两个导致一个操作(Invoke
调用)无法完成直到另一个操作完成且释放UI线程(Parallel.For
)的情况,但是第二个操作直到个人工作项目完成。
如果您只是更新用户界面,则可以使用BeginInvoke
代替Invoke
来避免死锁。这将导致实际方法(CheckTable
)运行,并在整个操作完成后设置值。