2017-05-06 125 views
1

我有一個定時器運行18秒,我想知道是否有可能在定時器倒計時期間每1.5秒更新一次變量。定時器執行期間每秒更新一次變量

只需要2個定時器一個18秒另一個定時器1.5秒更容易。

是否有任何其他方法可以更容易或更好。

+0

請告訴我們您的定時器功能。你正在使用什麼計時器?如果您使用的計時器有一種方法,您可以以毫秒爲單位獲得當前的倒計時時間,則可以使用模1500,如if(currentcountdownTimeInMs%1500 == 0)... –

回答

2

使用微軟的Reactive Framework(NuGet「System.Reactive」)。然後,你可以這樣做:

long x = 0L; 
Observable 
    .Interval(TimeSpan.FromSeconds(1.5)) 
    .Take(12) // 18 seconds 
    .Subscribe(n => 
    { 
     //update variable 
     x = n; 
    },() => 
    { 
     //Runs when timer ends. 
    }); 

這就避免了所有,你問的是糞定時器。簡而言之,如果你想使用定時器,那麼你只需要1.5秒的時間間隔 - 但是在12次後停止這個時間,讓你持續18秒。

+2

謝謝,這真的有所幫助。 –

+0

我希望使用計時器設置爲1.5秒,因爲這個程序應該可以在我大學校園裏的任何一臺計算機上工作,我認爲該程序應該工作而無需安裝其他組件。 –

+0

如果你的第18條要求很緊,你可能會發現1.5秒計時器漂移,12次重複始終持續18秒多一點。時間不少於1.5秒,所以通常更長。結果是錯誤將累積12倍以上。再說一遍,如果你的容忍度很低或者重複次數依然很少,那就不重要了。 – rfreytag

1
public partial class Form1 : Form 
{ 
    Timer timer = new Timer(); 
    private long Elapsed; 

    public Form1() 
    { 
     InitializeComponent(); 
     // set interval to 1.5 seconds 1500 (milliseconds) 
     timer.Interval = 1500; 
     // set tick event withs will be runt every 1.5 seconds 1500 (milliseconds) 
     timer.Tick += OnTimerTick; 
     // start timer 
     timer.Start(); 
    } 

    private void OnTimerTick(object sender, EventArgs e) 
    { 
     // add 1500 milliseconds to elapsed 1500 = 1.5 seconds 
     Elapsed += 1500; 
     // check if 18 seconds have elapsed 
     // after 12 times it will be true 18000/1500 = 12 
     if (Elapsed == 18000) 
     { 
      // stop the timer if it is 
      timer.Stop(); 
     } 
     // update variable 
    } 
} 
-2

我使用異步/等待爲 - 幫我帶PCL尚未事件計時器

private async void RunTimerAsync() 
    { 
      await Timer(); 
    } 

    private async Task Timer() 
    { 
     while (IsTimerStarted) 
     { 
       //Your piece of code for each timespan 
       //ElapsedTime += TimeSpan.FromSeconds(1.5); 
       await Task.Delay(TimeSpan.FromSeconds(1.5)); 
     } 
    } 
+1

Task.Delay在內部使用Timer。此外,您還需要延長您的答案以包括18秒鐘的時間 –