这是状态信息显示的最佳方式吗?

时间:2012-07-07 09:37:22

标签: c# winforms multithreading

这是使用显示一段时间的状态消息的最佳方式吗?

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"]);
在整个应用程序操作期间,

stsStatusMsgToolStripStatusLabel)只能通过此方法访问。

上面的代码实际上有效。消息显示在控件上2秒钟然后消失......

1 个答案:

答案 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事件,这意味着您不必担心对控件的跨线程访问。

免责声明:我只是在不使用编译器的情况下考虑了上述示例,可能需要进行调整。