2014-02-27 53 views
1

我知道这听起来很模糊,但我会尽我所能解释......我有一个我在C#中制作的网页抓取工具,其中包含界面上的几个选项卡。底部是一个带有少量状态标签的工具箱容器。主选项卡有一个ListView,它不断被其他线程更新。Toolstrip标签不更新,直到我切换标签

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

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

只要我切换回主选项卡,更新停止。请注意,这只发生在程序运行几个小时之后。

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

下面是计时器代码:

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

太感谢!

+1

亲爱的,你可以pleae分享relavent代码?并且你正在使用哪个定时器是'system.Windows.Forms.Timer?' –

+0

对不起,为定时器添加了代码,是的,它是一个System.Windows.Forms.Timer – blizz

+0

'System.Windows.Forms.Timer'类没有'Elapsed'属性。但'System.Diagnostics.StopWatch'类呢。那么你是否开始了'StopWatch'并让'Timer'触发'Tick'事件来读取'StopWatch.Elapsed'属性? –

回答

0

试验表明:(一段时间的形式不被reloded)

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

使用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(); 
} 

说明Refresh()方法从MSDN的:

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

+0

这很有道理......我会先试试这个,看看它是否有帮助。我会回复。 – blizz

+0

有关此问题的任何更新? –

+0

我在每一个控件上都使用了ResumeLayout。我在每一个控件上都使用了Invalidate()。刷新终于起作用。 +1。 –

1

你可以尝试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); 
    } 
+0

虽然“System.Windows.Forms.Timer”确实不会引发UI线程无法处理它们时发生的事件。当UI线程可用时,'System.Timers.Timer'将对要处理的事件进行排队。我没有看到它与OP的问题有什么关系 - 排队这些事件的方式如何解决显示时间流逝的“ToolStripLabel”问题? –