【问题标题】:Toolstrip labels do not update until I switch tabs在我切换标签之前,工具条标签不会更新
【发布时间】:2014-02-27 13:45:33
【问题描述】:

我知道这听起来很模糊,但我会尽力解释...我有一个用 C# 制作的网络爬虫,其中包含界面上的一些选项卡。底部是带有一些状态标签的工具条容器。主选项卡有一个 ListView,它会被其他线程不断更新。

标签由每秒运行的计时器更新。

让程序运行一段时间后,标签不再更新,而焦点位于主选项卡(带有 ListView 的选项卡)上。相反,我必须单击任何其他选项卡,然后它会自动更新并每秒继续更新。

一旦我切换回主选项卡,更新就会停止。请注意,这仅在程序运行几个小时后才会发生。

所以,很抱歉这个模糊的问题,但是有没有人可以在这里指出正确的方向?

这是计时器的代码:

private void timerRuntime_Tick(object sender, EventArgs e)
{
    lblRuntime.Text = string.Format("Runtime [{0:dd\\:hh\\:mm\\:ss}]", stopWatch.Elapsed);
}

谢谢!

【问题讨论】:

  • 亲爱的你能分享一下相关代码吗?你用的是哪个定时器system.Windows.Forms.Timer?
  • 抱歉,为计时器添加了代码,是的,它是 System.Windows.Forms.Timer
  • System.Windows.Forms.Timer 类没有 Elapsed 属性。但是System.Diagnostics.StopWatch 类可以。那么您是否正在启动StopWatch 并让Timer 触发读取StopWatch.Elapsed 属性的Tick 事件?
  • 我认为您需要使用System.Timers.Timer 而不是SYstem.Windows.Fomrs.Timer 在下面查看我的答案
  • @SudhakarTillapudi:我很好奇你为什么这么说。

标签: c# .net multithreading winforms .net-4.5


【解决方案1】:

使用Control.Refresh Method 强制ToolStrip 控件重绘自身:

private void timerRuntime_Tick(object sender, EventArgs e)
{
      lblRuntime.Text = string.Format("Runtime [{0:dd\\:hh\\:mm\\:ss}]", stopWatch.Elapsed);
      toolStrip1.Refresh();
}

来自 MSDN 的Refresh() 方法的描述:

强制控件使其客户区无效并立即 重绘自身和任何子控件。

【讨论】:

  • 这很有意义......我会先尝试这个,看看它是否有帮助。我会回帖的。
  • 我在每个控件上都使用了 ResumeLayout。我在每个控件上都使用了 Invalidate()。刷新终于起作用了。 +1。
【解决方案2】:

你可以试试System.Timers.Timer

试试这个:

    System.Timers.Timer timer1 = new System.Timers.Timer();
    timer1.Interval = 60000;//one minute
    timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Tick);
    timer1.Start();

    private void timer1_Tick(object sender, System.Timers.ElapsedEventArgs e)
    {
      lblRuntime.Text = string.Format(
           "Runtime [{0:dd\\:hh\\:mm\\:ss}]", stopWatch.Elapsed);
    }

【讨论】:

  • 虽然System.Windows.Forms.Timer 确实不会引发在 UI 线程无法处理它们时发生的事件。 System.Timers.Timer 只会在 UI 线程可用时将要处理的事件排队。我看不出它与 OPs 问题有何关系 - 排队事件将如何解决 ToolStripLabel 显示已用时间的问题?
【解决方案3】:

测试一下:(有时表格不会被重新加载)

Invoke(new Action(() => lblRuntime.Text = string.Format("Runtime [{0:dd\\:hh\\:mm\\:ss}]", stopWatch.Elapsed))); 

【讨论】:

    猜你喜欢
    • 2017-07-21
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    相关资源
    最近更新 更多