锁是否需要这个.Invoke

时间:2011-02-22 16:47:16

标签: c# winforms invoke

我遇到了第三方代码,它使用invoke来更新控件,但是调用是在一个锁语句中,例如

 lock (mi) 
 {
   this.Invoke(mi);
 }

其中mi是System.Windows.Forms.MethodInvoker mi。

调用的方法只是更新一个窗口控件(列表框),并在创建用户控件时进行初始化,并且永远不会更改。

所以有两个问题

  1. 是否需要锁?
  2. 是否可能导致问题?

1 个答案:

答案 0 :(得分:6)

使用Control.Invoke周围的锁定是在寻找麻烦。你基本上说,“我会等到另一个线程处理我的委托” - 但如果那个线程(UI线程)试图获得相同的锁,它将无法因为工作线程已经拥有它。砰 - 即时僵局。

使用BeginInvoke这不会是一个问题,但它仍然不是一个好主意。基本上这看起来像是一个人的代码,他的想法是使代码线程安全,就是左右锁定中心。

现在,当代码锁定代理引用时,很难说是否尝试获取相同的锁...但如果没有,则锁定是毫无意义的开头。