C# Control.invoke和父控件

C# Control.invoke和父控件,c#,.net,winforms,C#,.net,Winforms,假设我有一个名为MainForm的表单和一个控件:somelabel。为了从另一个线程访问这些控件,我必须使用Invoke方法。e、 g: somelabel.Invoke(...); 但是,我也可以通过如下表单访问标签: MainForm.Invoke(...) //Code for manipulating somelabel 这两个代码段在性能或其他技术方面有什么不同吗?没有。每个Windows窗体控件都公开一个调用方法,它们的功能都相同。无论使用哪个控件(无论是窗体还是子控件),您都

假设我有一个名为MainForm的表单和一个控件:somelabel。为了从另一个线程访问这些控件,我必须使用Invoke方法。e、 g:

somelabel.Invoke(...);
但是,我也可以通过如下表单访问标签

MainForm.Invoke(...) //Code for manipulating somelabel

这两个代码段在性能或其他技术方面有什么不同吗?

没有。每个Windows窗体控件都公开一个调用方法,它们的功能都相同。无论使用哪个控件(无论是窗体还是子控件),您都将执行相同的基本操作,因此性能将是相同的


一、 就个人而言,更喜欢使用表单而不是单个控件。这使得以后更容易返工设计,因为您可以删除或添加控件,而无需中断通过表单调用的代码。另一个好的选择是使用,您可以通过检索。这为您提供了一种生成同步上下文的方法,您可以使用它(通过发送/发布而不是调用)执行相同的操作,但它不与任何控件绑定。

实际上不。。。重要的是,这两个控件都使用相同的UI线程。实际上,您只是使用该控件来确定将委托调用封送到哪个线程。一般来说,使用您将要实际使用的控件会更清晰,但结果是一样的


请注意,如果您有两个不同的窗口使用两个不同的UI线程(例如,一个启动屏幕使用一个UI线程显示,而另一个正在忙于构建主UI),则会产生不同。只有少数情况下您需要多个UI线程,但黄金法则是一个窗口中的所有控件都必须使用相同的UI线程,因此在同一窗口中使用任何UI对象都可以。

谢谢您的回答。我也喜欢Form.Invoke,因为我只需要使用Invoke一次,我想知道是否有任何区别。你是说即使在单个进程下运行,多个UI线程也可以共存,每个窗体/窗口一个?