Control.invoke和父控件

可以说我有一个名为MainForm的表单,并对其进行控制:somelabel。 为了从另一个线程访问这些控件,我必须使用Invoke方法。 例如:

somelabel.Invoke(...); 

但是我也可以通过以下forms访问标签

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

这两个片段在性能或其他技术方面有什么区别吗?

不是。每个Windows窗体控件都公开一个Invoke方法,它们都以相同的方式运行。 无论您使用哪种控件(无论是表单还是子控件),您仍将执行相同的基本操作,因此性能将相同。

我个人更喜欢使用表单而不是单独的控件。 这使得以后更容易重新设计,因为您可以删除或添加控件而不会破坏通过表单调用的代码。 另一个不错的选择是使用WindowsFormsSynchronizationContext ,您可以通过SynchronizationContext.Current检索它。 这为您提供了一种生成可以使用的同步上下文的方法(通过Send / Post而不是Invoke),它可以执行相同的操作,但不依赖于任何控件。

不是真的……重要的是这两个控件都使用相同的UI线程。 实际上你只是使用控件来计算哪个线程编组委托调用。 使用您实际使用的控件通常更清晰,但结果将是相同的。

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