2014-04-17 46 views
1

我需要一個等待指定數量的DateTime.Ticks(約155 000)的函數。不幸的是,它與下面的函數不是真的(等了大約30萬蜱):睡眠特定的Ticks

private void sleep_ticks(long t) 
{ 
    long _start = DateTime.Now.Ticks + t; 
    int i = 0; 

    do 
    { 
     i++; 
     Console.WriteLine((DateTime.Now.Ticks - _start) + " => " + i); 
     if (DateTime.Now.Ticks >= _start) 
      break; 
    } while (true); 

    Console.WriteLine((DateTime.Now.Ticks - _start) + " < " + t + " -- " + i); 
    Console.ReadLine(); 
} 

我加了一些調試輸出:-) 最後的值必須接近於0

這裏是輸出sleep_ticks(1):

-1 => 1; -1 => 2; -1 => 3; -1 => 4; -1 => 5; -1 => 6; -1 => 7; -1 => 8; -1 => 9; -1 => 10; 
-1 => 11; -1 => 12; -1 => 13; -1 => 14; -1 => 15; -1 => 16; -1 => 17; -1 => 18; -1 => 19; 
-1 => 20; -1 => 21; -1 => 22; -1 => 23; -1 => 24; -1 => 25; -1 => 26; -1 => 27; -1 => 28; 
-1 => 29; 156262 < 1 -- 29; 

沒有人有任何想法,爲什麼這可能是,或如何解決呢?

感謝和問候 羅伯特

+1

Windows不是實時操作系統。可能發生的事情是您的程序被操作系統中的其他事件中斷。即使使用'Thread.Sleep',你唯一的保證就是隻要你請求,它至少會等待*。 –

+0

看起來您已經重新創建了['Thread.Sleep'](http://msdn.microsoft.com/zh-cn/library/d00bd51t(v = vs.110).aspx),儘管需要將刻度轉換爲毫秒?您可能想要以一個緊密循環的形式持續檢查'DateTime.Now'將咀嚼您的CPU。 – StuartLC

+0

Console.WriteLine尤其是帶有調試器的連接速度非常慢,它可能會延遲您的循環 – thumbmunkeys

回答

3

使用Thread.Sleep

System.Threading.Thread.Sleep(new TimeSpan(155000)); 
0

這是命令暫停系統,你應該能夠落實到你的代碼,讓它做什麼,你需要它。

System.Threading.Thread.Sleep(100); 

如果我有100,你可以將它設置爲你的DateTime.Now.Ticks,它應該仍然工作。

+1

nope,即睡眠時間爲毫秒 – thumbmunkeys

+1

DateTime.Now.Ticks也會睡幾十年 – Ian

+0

那麼晚安 – thumbmunkeys

0

private void TicksDrivenSleepingThread(long Ticks) int imillisecondsTimeout;

 // http://msdn.microsoft.com/en-us/library/system.datetime.ticks.aspx 
     //A single tick represents one hundred nanoseconds or one ten-millionth of a second. There are 10,000 ticks in a millisecond. 
     //Convert Ticks to their Millseconds Equivalen 
     imillisecondsTimeout = Convert.ToInt32((Ticks/10000)); 

     while (true) 
     { 

      //Wait 
      Thread.Sleep(imillisecondsTimeout); 
      //Do What Needs Doing 
     } 


    } 
2

「我需要一個功能,等待爲DateTime.Ticks指定數量。」這不可能。

使用System.Threading.Thread.Sleep(int millisecondsTimeout)來計算以毫秒爲單位的等待精度。

// Puts the current thread to sleep for 15 milliseconds. 
System.Threading.Thread.Sleep(15); 

應該就接受的答案(https://stackoverflow.com/a/23134395/3076020)說了Thread.Sleep(時間跨度)無視毫秒小數注意。

「睡眠的此重載採用整體毫秒的總數目在超時分數毫秒被丟棄。」如這裏記載:https://msdn.microsoft.com/en-us/library/274eh01d(v=vs.110).aspx

這意味着一半一毫秒將在最小時間段被忽略在使用TimeSpan提供Thread.Sleep 155000 ticks時等待。單毫秒內有10000個滴答,因此155000個滴答= 15.5毫秒。雖然這在等待15毫秒的情況下可能沒有太大影響。它可能會在實際需要蜱或某種精度比毫秒更準確的場景中產生影響。這就是爲什麼在這種情況下,我建議使用整數(毫秒)過載來澄清。

如果使用毫秒不適用我建議看着旋轉線程。意思是保持其活動/繁忙,重複檢查呼叫之間適當的高分辨率定時器。即使這樣也容易產生不準確的結果,因爲操作系統可能安排另一個更高優先級的線程,從而導致時間偏差。


請注意主題。睡眠是保持線程脫離調度程序的最短時間,避免處理,休眠。線程最終可能會「等待」以恢復處理時間超過指定時間。這個答案提供了一些澄清爲什麼Thread.Sleep不總是精確地指定時間。 https://stackoverflow.com/a/6254753/3076020

有關單個毫秒爲10,000個滴答的參考信息。我相信這是.NET的標準,不能改變。 https://msdn.microsoft.com/en-us/library/system.timespan.tickspermillisecond(v=vs.110).aspx