1

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

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(即 a ToolStripStatusLabel)在整个应用程序操作期间只能通过此方法访问。

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

4

1 回答 1

5

如果这是在 WinForms 中,我怀疑,这不太可能工作。您只能从主窗口消息线程访问 UI 控件,可以通过使用控件来访问Invoke更新,虽然您的代码确实有效,但这是因为您从线程操作的实际对象不是Control- 通常在 WinForms 中,不允许跨线程访问

此外,每个状态的新线程似乎都过大了。是的,线程将在某个时候被 GC 释放,但是线程是一种昂贵的创建资源,并且您的代码会为每个状态更改创建一个。更好的方法是使用内置线程池(您可以在其中从框架管理的池中获取长寿命线程上的处理时间),或者使用Timer专为按指定时间间隔运行代码而设计的 .

如何更改文本,然后在所需时间后使用 Timer 再次隐藏它?

这是使用 a 的解决方案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 线程上引发了计时器事件,这意味着您不必担心对控件的跨线程访问。

免责声明:我只是在没有使用编译器的情况下想出了上面的示例,可能需要对其进行调整。

于 2012-07-07T09:40:09.443 回答