这是使用显示一段时间的状态消息的最佳方式吗?
private void SetStatus(Color _color, string _msg)
{
System.Threading.Thread t = new System.Threading.Thread(() =>
{
stsStatusMsg.ForeColor = _color;
stsStatusMsg.Text = _msg;
System.Threading.Thread.Sleep(2000);
stsStatusMsg.Text = "";
});
t.Start();
}
调用它的示例:
SetStatus(Color.Red, AppMessages["msgALREADYIN"]);
在整个应用程序操作期间, stsStatusMsg
(ToolStripStatusLabel
)只能通过此方法访问。
上面的代码实际上有效。消息显示在控件上2秒钟然后消失......
答案 0 :(得分:5)
如果这是在WinForms中,我怀疑,这可能不起作用。您只能从主窗口消息线程访问UI控件,可以使用控件上的Invoke
来访问它。 更新,虽然您的代码确实有效,但这是因为您从线程操作的实际对象不是Control
- 通常在WinForms中,不允许跨线程访问。
此外,每个状态的新线程似乎有点过分。是的,线程将在某些时候由GC处理,但是线程是一种昂贵的资源,而且您的代码会为每个状态更改创建一个。更好的方法是使用内置线程池(在框架管理的池中从长期存在的线程获取处理时间),或者使用Timer
,用于在以下位置运行代码指定的间隔。
如何更改文本,然后使用计时器在所需时间后再次隐藏它?
以下是使用Timer
:
private void SetStatus(Color _color, string _msg)
{
stsStatusMsg.ForeColor = _color;
stsStatusMsg.Text = _msg;
timer.Start();
}
private void StatusTimer_Elapsed(object sender, EventArgs e)
{
stsStatusMsg.Text = "";
timer.Stop();
}
上面的代码假定计时器已经构建,并且它的Tick
事件已连接到StatusTimer_Elapsed
事件。 System.Windows.Forms.Timer
类非常适合这种情况的原因是在UI线程上引发了timer事件,这意味着您不必担心对控件的跨线程访问。
免责声明:我只是在不使用编译器的情况下考虑了上述示例,可能需要进行调整。