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