我遇到了第三方代码,它使用invoke来更新控件,但是调用是在一个锁语句中,例如
lock (mi)
{
this.Invoke(mi);
}
其中mi是System.Windows.Forms.MethodInvoker mi。
调用的方法只是更新一个窗口控件(列表框),并在创建用户控件时进行初始化,并且永远不会更改。
所以有两个问题
答案 0 :(得分:6)
使用Control.Invoke
周围的锁定是在寻找麻烦。你基本上说,“我会等到另一个线程处理我的委托” - 但如果那个线程(UI线程)试图获得相同的锁,它将无法因为工作线程已经拥有它。砰 - 即时僵局。
使用BeginInvoke
这不会是一个问题,但它仍然不是一个好主意。基本上这看起来像是一个人的代码,他的想法是使代码线程安全,就是左右锁定中心。
现在,当代码锁定代理引用时,很难说是否将尝试获取相同的锁...但如果没有,则锁定是毫无意义的开头。