睡眠特定蜱虫

时间:2014-04-17 13:18:27

标签: c# timer

我需要一个等待指定数量的DateTime.Ticks(大约155 000)的函数。不幸的是,它没有真正使用以下功能(等待大约300 000个滴答):

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;

有没有人知道为什么会这样,或者如何修复它?

谢谢和问候 罗伯特

4 个答案:

答案 0 :(得分:3)

使用Thread.Sleep

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

答案 1 :(得分:3)

&#34;我需要一个等待的功能,用于指定数量的DateTime.Ticks。&#34;这是不可能的。

使用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(TimeSpan)忽略小数毫秒。

&#34; Sleep的这个重载使用超时中的整数毫秒。 丢弃小数毫秒。&#34;如此处所述:https://msdn.microsoft.com/en-us/library/274eh01d(v=vs.110).aspx

这意味着在使用TimeSpan提供Thread.Sleep 155000 ticks的最短时间内,将忽略半毫秒。在一毫秒内有10000个滴答,因此155000滴答= 15.5毫秒。虽然这在15毫秒等待的情况下可能没有太大影响。在实际需要滴答或某些措施比毫秒更精确的情况下,它可能会产生影响。这就是为什么在这种情况下我建议使用整数(毫秒)重载清晰。

如果使用毫秒不适用,我建议考虑旋转线程。这意味着让它保持活动/忙碌,在呼叫之间反复检查适当的高分辨率计时器即使这样也容易产生不准确的结果,因为操作系统可能会调度另一个优先级较高的线程,从而使时间偏差。


请注意Thread.Sleep是保持线程不受调度程序限制,保持处理,休眠的最短时间。线程最终可能会等待&#34;恢复超过指定的处理时间。这个答案提供了一些清晰的信息,说明为什么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

答案 2 :(得分:0)

这是暂停系统的命令,您应该能够将它实现到您的代码中,以使其能够满足您的需求。

System.Threading.Thread.Sleep(100);

如果我有100个你可以将它设置为你的DateTime.Now.Ticks,它应该仍然有效。

答案 3 :(得分: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
        }


    }