我想在标签上显示特定时间的文字,所以我在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;
}
答案 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”属性只是告诉我们当前线程是否没有创建可视对象。在线程化或制作委托方法时,应始终使用此方法(因为您无法控制运行它们的线程。)
我希望这个简短的解释有所帮助。评论是否不清楚