Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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 - Fatal编程技术网

C# 方法调用程序差异?

C# 方法调用程序差异?,c#,winforms,C#,Winforms,这两者之间的区别是什么: richTextBox1.Invoke((MethodInvoker)(() => richTextBox1.Clear())); 这是: Invoke((MethodInvoker)(() => richTextBox1.Clear())); ? 第一个更好吗?在第二个例子中,调用的方法是在表单上调用的。。。换句话说,这个.Invoke() 这是从控件类继承的。只要它们都在UI线程上,它们都应该工作。在第二种情况下,调用方法是在表单上调用的。。。换句话

这两者之间的区别是什么:

richTextBox1.Invoke((MethodInvoker)(() => richTextBox1.Clear()));
这是:

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


第一个更好吗?

在第二个例子中,调用的方法是在表单上调用的。。。换句话说,这个.Invoke()


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

在第二种情况下,调用方法是在表单上调用的。。。换句话说,这个.Invoke()


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

第二个是在隐式
引用上调用
Invoke
,可能是针对
表单
用户控件
中的代码

鉴于此,两者都使用继承的
控件.Invoke
方法。这意味着问题只会变成:

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

如果控件绑定到同一个UI线程,则什么都没有

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


多个UI线程是一件非常糟糕的事情。如果你能避免,就不要使用它们。假设您接受该建议,这意味着您调用哪个控件并不重要(只要您不调用
null
控件)。

第二个是调用隐式
引用上的
Invoke
,可能用于
表单
用户控件
中的代码

鉴于此,两者都使用继承的
控件.Invoke
方法。这意味着问题只会变成:

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

如果控件绑定到同一个UI线程,则什么都没有

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


多个UI线程是一件非常糟糕的事情。如果你能避免,就不要使用它们。假设您接受该建议,这意味着您调用哪个控件并不重要(只要您不调用
null
控件)。

谢谢。我反编译了框架的Invoke方法:public object Invoke(Delegate method){返回this.Invoke(method,(object[])null);}它返回“this”。如果我使用richTextBox1.Invoke((MethodInvoker)(()=>richTextBox1.Clear()),代码不是更快了吗;因为this==richTextBox1在另一种情况下,线程将调用完整的表单(更大的对象),因为this==form1@PhazBlue在该上下文中使用
this
只意味着它调用同一方法的不同重载。如果不提供第二个参数(最终将传递给您提供的委托的参数),那么它将传递一个空对象数组。这与此的运行时类型没有性能差异。我可以向您保证,无论是这一点,还是其他任何事情,都不会导致您在这一比较中发现的任何性能差异。谢谢。我反编译了框架的Invoke方法:public object Invoke(Delegate method){返回this.Invoke(method,(object[])null);}它返回“this”。如果我使用richTextBox1.Invoke((MethodInvoker)(()=>richTextBox1.Clear()),代码不是更快了吗;因为this==richTextBox1在另一种情况下,线程将调用完整的表单(更大的对象),因为this==form1@PhazBlue在该上下文中使用
this
只意味着它调用同一方法的不同重载。如果不提供第二个参数(最终将传递给您提供的委托的参数),那么它将传递一个空对象数组。这与此的运行时类型没有性能差异。我可以向您保证,无论是这一点,还是其他任何事情,都不会导致您在这一比较中所感受到的任何性能差异。