代码之家  ›  专栏  ›  技术社区  ›  Giorgi

control.invoke和父控件

  •  3
  • Giorgi  · 技术社区  · 14 年前

    假设我有一个名为mainForm的表单,上面有一个控件:someLabel。为了从另一个线程访问这些控件,我必须使用invoke方法。例如:

    somelabel.Invoke(...);
    

    但是我也可以访问 标签 通过这样的形式:

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

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

    2 回复  |  直到 14 年前
        1
  •  4
  •   Reed Copsey    14 年前

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

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

        2
  •  2
  •   Jon Skeet    14 年前

    不是真的…重要的是这两个控件都使用同一个UI线程。实际上,您只是使用该控件来计算要封送委托调用的线程。一般来说,使用你将要实际使用的任何控件都会更清楚。 使用 但结果是一样的。

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