【问题标题】:MethodInvoker vs Control.InvokeMethodInvoker 与 Control.Invoke
【发布时间】:2011-07-25 12:52:48
【问题描述】:

我正在对计时器进行简单的 GUI 更新。如果我要更新单个控件,哪种方法更好用? MethodInvoker 是这样的:

this.Invoke((MethodInvoker)delegate
{
  systemMode.Text = systemMode.ToString();
});

或者像这样创建一个控件调用:

public void UpdateSystemMode()
{
    if (systemMode.InvokeRequired)
    {
         UpdateSystemMode.Invoke(new
             UpdateSystemModeDelegate(UpdateSystemMode));
    }
    else
    {
        systemMode.UpdateSystemMode();
    }  
}

显然,方法调用程序的代码较少,但哪一个是最佳实践?

【问题讨论】:

    标签: c# multithreading invoke


    【解决方案1】:

    UpdateSystemMode.Invoke(new UpdateSystemModeDelegate(UpdateSystemMode));

    this.Invoke((MethodInvoker)delegate
    {
      systemMode.Text = systemMode.ToString();
    });
    

    完全一样 还有

    this.Invoke((Action)(()=> systemMode.Text = systemMode.ToString()));
    

    正确的方法:

    public void UpdateSystemMode()
    {
        if (this.InvokeRequired)
             this.BeginInvoke((Action)UpdateSystemMode);
        else
            systemMode.UpdateSystemMode(); 
    }
    

    【讨论】:

    • 感谢您的回复。你的最后一行需要第一个';'不过被删除了。
    • 请注意BeginInvokeInvoke 的语义不同!如果您使用MethodInvoker 委托类型而不是Action,则Control.Invoke 应该更快。
    • @Sven,Invoke 方法的 Action 和 MethodInvoker 有什么区别? O_o 它们都是无参数的,并且返回类型为 void。
    • 是的,我知道 BeginInvoke 和 Invoke 之间的区别 - BeginInvoke 的性能不那么粗糙 :)
    • @Jason,简而言之 - 通过使用 BeginInvoke - 您的工作线程将不会等待委托方法的完成
    猜你喜欢
    • 1970-01-01
    • 2010-11-13
    • 2015-09-30
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多