2015-06-11 110 views
-1

我需要在除主UI線程之外的另一個線程中運行倒計時器。因此我不能使用DispatcherTimer,因爲它只存在於主線程中。因此,我需要在System.Timers.Timer一些幫助 - 我無法找到如何在網絡上創建一個倒數計時器任何很好的例子..使用System.Timers.Timer的線程中的倒數計時器

這是我走到這一步:

Private void CountdownThread() 
{ 
    // Calculate the total running time 
    int runningTime = time.Sum(x => Convert.ToInt32(x)); 

    // Convert to seconds 
    int totalRunningTime = runningTime * 60; 

    // New timer 
    System.Timers.Timer t = new System.Timers.Timer(1000); 
    t.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) => totalRunningTime--; 

    // Update the label in the GUI 
    lblRunning.Dispatcher.BeginInvoke((Action)(() => {lblRunning.Content = totalRunningTime.ToString(@"hh\:mm\:ss");})); 
}   

標籤lblRunning顯示倒計時值。

編輯:問題是我不知道如何在單獨的線程中製作倒數計時器並更新此線程的標籤!

+1

你說你不能使用主線程,但爲什麼不呢?這聽起來像你想用計時器來更新用戶界面,爲什麼不使用'DispatcherTimer'?這幾乎是它的目的! –

+0

@charles_mager由於應用程序的設計,我不能使用'DispatcherTimer' - 這不是我的決定:-( – MikaelKP

+0

問題是*爲什麼*你不能使用它。你的應用程序的設計如何防止你使用它嗎?畢竟,它正是*你應該使用的工具 – Servy

回答

0

當使用System.Threading.Tasks安排在主UI線程上工作,主UI線程不會被阻斷。可以在按鈕點擊事件上使用async關鍵字,並執行一些預定的工作,例如,保存到數據庫。當按鈕點擊事件保存到數據庫時,用戶仍然可以使用UI並執行其他操作。

重新創建:使用任務不會阻塞UI線程;這只是調度owrk在一段時間內完成。它沒有消耗任何線程的時間 - 無論是UI線程還是任何其他線程)。

因此,實際上可以使用DispatcherTimer而不是System.Timers.Timer命名空間,因爲不需要新線程,也不會阻塞任何線程。

使用DispatcherTime倒數計時器的示例代碼如下所示:

namespace CountdownTimer 
{ 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
    public partial class MainWindow : Window 
    { 
     TimeSpan runningTime; 

     DispatcherTimer dt; 

     public MainWindow() 
     { 
      InitializeComponent(); 

      // Fill in number of seconds to be countdown from 
      runningTime = TimeSpan.FromSeconds(21600); 

      dt = new DispatcherTimer(new TimeSpan(0, 0, 1), DispatcherPriority.Normal, delegate 
      { 
       lblTime.Content = runningTime.ToString(@"hh\:mm\:ss"); 
       if (runningTime == TimeSpan.Zero) dt.Stop(); 
       runningTime = runningTime.Add(TimeSpan.FromSeconds(-1)); 
      }, Application.Current.Dispatcher); 

      dt.Start(); 
     } 
    } 
} 
0

您需要Start()定時器和更新/每刻度無效UI:

private void CountdownThread() { 
    // Calculate the total running time 
    int runningTime = time.Sum(x => Convert.ToInt32(x)); 

    // Convert to seconds 
    int totalRunningTime = runningTime * 60; 

    // New timer 
    System.Timers.Timer t = new System.Timers.Timer(1000); 
    t.Elapsed += (s, e) => { 
     totalRunningTime--; 
     // Update the label in the GUI 
     lblRunning.Dispatcher.BeginInvoke((Action)(() => { 
      lblRunning.Content = TimeSpan.FromSeconds(totalRunningTime).ToString(); 
     })); 
    }; 
    // Start the timer! 
    t.Start(); 
} 
+0

倒計時未開始 - 標籤只顯示hh:mm:ss – MikaelKP

+0

您的格式已損壞;我使用''totalRunningTime.ToString()''在WinForms中測試了我的代碼,而不是看編輯過的帖子。 –