2014-09-26 45 views
2

我是新手編程。我試圖使用System.Timer來評估時間(以毫秒爲單位),以便current timepast time + a number of milliseconds(符合未來條件)匹配時跳出while循環。評估循環中的DateTime.Now.Millisecond - C#

有時它會成功退出循環,但有時它會作爲無限循環運行。我認爲它與毫秒時鐘精度有關,但我不確定。控制檯輸出的變量顯示timeFuture是正確的。我看過Timespan,但不知道如何使用它。非常感謝任何反饋。

long end = 500; //500 milliseconds 
long timeStart = DateTime.Now.Millisecond; //time in milliseconds 
long timeFuture = timeStart + end; 
long timeNow = 0; 

while (true) 
{ 
    timeNow = DateTime.Now.Millisecond;    
    if (timeFuture - timeNow == 0) { break; }    
    Console.WriteLine(timeNow); 
} 
+0

你爲什麼這樣做,而不是使用'Timer',因爲你甚至不知道如何使用定時器? – Servy 2014-09-26 16:03:09

+0

首先閱讀http://blogs.msdn.com/b/ericlippert/archive/2010/04/08/precision-and-accuracy-of-datetime.aspx然後 – asawyer 2014-09-26 16:03:17

+1

如果你能夠做到的話,你的算法在理論上將起作用比較每毫秒,但由於速度有限,多任務,精度等原因,您無法做到這一點。最簡單的解決方法是比較'<0'而不是'== 0'(但是有更好的解決方案來實現你的目標) – Ondra 2014-09-26 16:04:17

回答

4

DateTime.Now.Milisecond不返回以毫秒爲單位的時間,但在時間點的DateTime實例代表實際milisecond(所以它永遠是0和999之間)。另外,當你在一個多線程系統上運行時,你的條件可能永遠不會在確定的時間點執行,當它計算到true(寫入控制檯也消耗時間)。

所以,你可能會考慮改變你的病情,並利用Timespan類:

DateTime timeStart = DateTime.Now; 

while (true) 
{ 
    DateTime timeNow = DateTime.Now; 
    TimeSpan difference = (timeNow - timeStart); 
    if (difference.TotalMilliseconds >= 500) { break; } 
    Console.WriteLine(timeNow); 
} 
+0

謝謝,這個答案很多!我意識到將會有一個從999回到0的問題(因爲它是在整個日期執行的),但不知道如何實現TimeSpan類。另外還有一個問題,那就是沒有一個確切的點,但是這與多線程相關......這是我現在頭上的事情。 – Chaz 2014-09-26 18:55:37

0

毫秒是時間的組成部分,而不是時間跨度。你要像

DateTime start = DateTime.Now; 
    while (true) 
    { 

     if ((DateTime.Now - start).TotalMilliseconds>500) // Is a timespan 
      { break; }    
     Console.WriteLine(timeNow); 
    }