锁是否需要这个.Invoke

sgm*_*ore 2 c# invoke winforms

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

 lock (mi) 
 {
   this.Invoke(mi);
 }
Run Code Online (Sandbox Code Playgroud)

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

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

所以有两个问题

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

Jon*_*eet 6

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

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

现在,当代码锁定委托引用时,很难说其他任何东西是否尝试获取相同的锁...但如果它没有,那么锁定开始时就没有意义了.