Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否需要使用此。调用_C#_Winforms_Invoke - Fatal编程技术网

C# 是否需要使用此。调用

C# 是否需要使用此。调用,c#,winforms,invoke,C#,Winforms,Invoke,我遇到了一段第三方代码,它使用invoke来更新控件,但是invoke在lock语句中,例如 lock (mi) { this.Invoke(mi); } 其中mi是System.Windows.Forms.MethodInvoker mi 调用的方法只是更新一个windows控件(一个列表框),并在创建usercontrol时进行初始化,并且从未更改 所以有两个问题 需要锁吗 它可能会引起问题吗 在控件.Invoke周围使用锁是自找麻烦。您基本上是说,“我会等到另一个线程处理完

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

 lock (mi) 
 {
   this.Invoke(mi);
 }
其中mi是System.Windows.Forms.MethodInvoker mi

调用的方法只是更新一个windows控件(一个列表框),并在创建usercontrol时进行初始化,并且从未更改

所以有两个问题

  • 需要锁吗
  • 它可能会引起问题吗

  • 控件.Invoke周围使用锁是自找麻烦。您基本上是说,“我会等到另一个线程处理完我的委托”——但是如果该线程(UI线程)尝试获取相同的锁,它将无法获取,因为工作线程已经拥有它。砰的一声,瞬间死锁

    使用
    BeginInvoke
    不会有问题,但仍然不是一个好主意。基本上,这看起来像是某个人的代码,他的想法是使代码线程安全,即在左、右和中央打锁


    现在,由于代码锁定了委托引用,很难说其他任何东西是否会尝试获取相同的锁。。。但如果没有,锁就毫无意义了。

    谢谢。我希望这就是答案,否则我将不得不重温我曾经写过的所有调用。