Control.invoke 和父控件

Gio*_*rgi 4 .net c# winforms

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

somelabel.Invoke(...);
Run Code Online (Sandbox Code Playgroud)

但是我也可以通过这样的表单访问标签

MainForm.Invoke(...) //Code for manipulating somelabel
Run Code Online (Sandbox Code Playgroud)

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

Ree*_*sey 5

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

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