0

我想在标签中显示特定时间的文本,所以我在谷歌上进行了搜索,我找到了这两个解决方案:

第一个解决方案是:

public void InfoLabel(string value)
{
    if (InvokeRequired)
    {
        this.Invoke(new Action<string>(InfoLabel), new object[] { value });
        return;
    }
    barStaticItem3.Caption = value;

    if (!String.IsNullOrEmpty(value))
    {
        System.Timers.Timer timer = 
                                new System.Timers.Timer(3000) { Enabled = true };
        timer.Elapsed += (sender, args) =>
        {
            this.InfoLabel(string.Empty);
            timer.Dispose();
        };
    }
}

第二种解决方案:

private void ShowTextForParticularTime(String caption)
{
    Timer t = new Timer { Interval = 5000, Enabled = true};
    t.Tick += (sender, args) => OnTimerEvent(sender, args, caption);  
}

private void OnTimerEvent(object sender, EventArgs e, String caption)
{
    barStaticItem3.Caption = caption;
}

您能否告诉我这两种解决方案之间的差异,以及为什么我们使用这个符号 "=>" ,我也从这一行中一无所知:

if (InvokeRequired)
{
    this.Invoke(new Action<string>(InfoLabel), new object[] { value });
    return;
}
4

2 回答 2

2

在 WinForms 和 WPF 中,只能从创建相关控件的线程更新 UI。这两种方法展示了两种从不同线程更新 UI 的方法。

第一种方法手动检查代码是否在不同的线程上运行,如果是,则编组对 UI 线程的调用。

第二种方法使用事件,将封送处理的细节留给 .NET

符号 => 代表一个lamda 表达式。你可以把它想象成一个函数指针(尽管有时它实际上是在幕后称为表达式树的东西)。本质上,它创建了一个变量,该变量指向可以通过引用该变量来调用的代码。

任何一种方法都应该可以正常工作。我个人更喜欢第二种方法,因为它允许框架处理更多的管道工作。

于 2012-09-26T23:47:49.267 回答
2

好的,这里有很多解释。

您显示的两个选项之间没有重大差异。它们看起来不同的原因是因为第一个 id 在公共方法中声明了一个委托方法(lambda 表达式),而第二个只是创建了一个事件处理程序。他们做几乎完全相同的事情。事实上,您可以看到在委托方法中您有传统的事件处理程序参数(对象发送者,EventArgs e)。我个人更喜欢第二种解决方案,因为它对我来说看起来更干净。

Invoke Required 用于处理线程。在 C# 中,如果未创建可视对象的线程尝试更改可视对象,则会引发错误。为了解决这个问题,我们通过调用“Invoke”来调用创建视觉对象的线程。“InvokeRequired”属性只是告诉我们当前线程是否没有创建可视对象。在线程化或制作委托方法时,您应该始终使用它(因为您无法控制运行它们的线程。)

我希望这个简短的解释会有所帮助。如果不清楚,请发表评论

于 2012-09-26T23:52:07.630 回答