Control.invoke和父控件

时间:2010-01-27 19:45:28

标签: c# .net winforms

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

somelabel.Invoke(...);

但我也可以通过以下格式访问标签

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

这两个片段在性能或其他技术方面是否有任何区别?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

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