MethodInvoker与众不同?

时间:2013-08-21 17:29:55

标签: c# winforms

这有什么区别:

richTextBox1.Invoke((MethodInvoker)(() => richTextBox1.Clear()));

和此:

Invoke((MethodInvoker)(() => richTextBox1.Clear()));

第一个更好吗?

2 个答案:

答案 0 :(得分:4)

第二个是在隐式Invoke引用上调用this,可能是针对FormUserControl内的代码。

鉴于此,两者都使用Control.Invoke方法的继承版本。这意味着问题就变成了:

  

在不同的控件上调用Invoke之间有什么区别?

如果控件绑定到同一个UI线程,则不执行任何操作。

如果它们绑定到不同的 UI线程,那么您正在调用该方法以在完全不同的线程处理的完全不同的消息循环中运行。如果要从委托正文中的其他UI线程访问控件,则会出现异常(或更糟糕的是,意外行为)。

多个UI线程是一个可怕的,可怕的东西。如果你可以避免使用它们,请不要使用它们。假设你接受了这个建议,这意味着你Invoke的控件无关紧要(只要你没有调用null控件)。

答案 1 :(得分:1)

在第二种情况下,在窗体上调用invoke方法...换句话说,this.Invoke()。

这是从Control类继承的。两者都应该工作,只要它们都在UI线程上。