2014-02-27 52 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」問題? –