在标签上显示特定时间的文本

时间:2012-09-26 23:40:45

标签: c# winforms

我想在标签上显示特定时间的文字,所以我在google上搜索了一下,我找到了这两个解决方案:

第一个解决方案是:

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;
}

请您告诉我两种解决方案之间的差异,以及为什么我们使用这个符号“=&gt;”我也从这条线上理解:

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

2 个答案:

答案 0 :(得分:2)

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

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

第二种方法使用一个事件,将编组的细节留给.NET

符号=&gt;代表lamda expression。你可以把它想象成一个函数指针(虽然有时它实际上是幕后的expression tree)。从本质上讲,它创建了一个变量,指向可以通过引用该变量来调用的代码。

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

答案 1 :(得分:2)

好的,这里有很多解释。

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

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

我希望这个简短的解释有所帮助。评论是否不清楚