【问题标题】:Is this the best way for status message display?这是状态消息显示的最佳方式吗?
【发布时间】:2012-07-07 09:37:22
【问题描述】:

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

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 秒,然后消失...

【问题讨论】:

  • stsStatusMsgStatusStrip?
  • @Ruel : 它是一个 ToolStripStatusLabel
  • 您是否考虑过使用另一个控件,该控件基本上是所有状态消息及其发送时间的列表;仅闪烁状态然后将其删除的问题在于它可能会被错过,或者,如果您想实际查看消息是什么,则无法真正做到这一点。否则,请参阅msdn.microsoft.com/en-us/library/ms171728(v=vs.110).aspx - 我很惊讶您没有收到跨线程访问异常。另见stackoverflow.com/questions/1127973/…
  • @dash:见下面的@ruel 评论。我很幸运的原因是 ToolStripStatusLabel 不继承自 Control
  • @e4rthdog 不用担心,但从调试/日志记录的角度来看,有一个地方可以查看所有发送给用户的状态消息(以及何时发送给用户)非常有用。我通常在屏幕底部有一个可停靠的网格来保存此信息,并在其标题文本中显示最后一条状态消息。不过,我认为您不需要计时器。您的解决方案实际上是一个事件的模拟 - 将消息发送到 GUI,GUI 显示它然后擦除它并等待下一条消息。

标签: c# winforms multithreading


【解决方案1】:

如果这是在 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 线程上引发了计时器事件,这意味着您不必担心对控件的跨线程访问。

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

【讨论】:

  • 虽然我怀疑这不是最好的方法,但它确实有效……你能详细说明一下调用吗?
  • @e4rthdog,这是 Windows 窗体吗?
  • 是的..抱歉没提,我更新了最初的帖子
  • 为什么这是矫枉过正?线程在工作完成后被释放,不是吗?
  • @e4rthdog,这似乎是合理的。但是,请注意,如果您在每个间隔(2 秒)内生成多个状态消息,则可能会出现问题(即,用户在一秒钟内看到第一条消息,然后在一秒钟内看到另一条消息) - 我不知道不知道这是否会成为您的应用程序的问题。如果是;那么我会建议您使用一种方法,让用户可以看到一个消息列表,而不是一次只看到一个消息列表 - 正如另一条评论中所建议的那样。
猜你喜欢
  • 2011-04-05
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多