【问题标题】:Why is minimum Threading.Timer interval 15ms despite timeBeginPeriod(1)为什么尽管 timeBeginPeriod(1) 最小 Threading.Timer 间隔为 15ms
【发布时间】:2013-06-03 09:38:57
【问题描述】:

下面的sn-p

    [DllImport("winmm.dll", EntryPoint = "timeBeginPeriod")]
    public static extern uint TimeBeginPeriod(uint uMilliseconds);

    static void Main(string[] args)
    {
        if (TimeBeginPeriod(1) != 0)
            Console.WriteLine("TimeBeginPeriod failed!");

        Console.WriteLine("Sleep");
        Stopwatch sw = Stopwatch.StartNew();
        for (int i = 0; i < 10; i++)
        {
            Thread.Sleep(1);
            Console.WriteLine(sw.ElapsedTicks * 1000d / Stopwatch.Frequency);
            sw.Restart();
        }

        Console.WriteLine("Threading.Timer");
        sw = null;
        System.Threading.Timer t = null;
        int n = 0;

        t = new Timer(state =>
        {
            if (sw == null)
                sw = Stopwatch.StartNew();
            else
            {
                Console.WriteLine(sw.ElapsedTicks * 1000d / Stopwatch.Frequency);
                n++;
                sw.Restart();
            }
            if (n == 10)
                t.Change(Timeout.Infinite, Timeout.Infinite);
        }, null, TimeSpan.FromMilliseconds(1), TimeSpan.FromMilliseconds(1));
        Console.ReadKey();
    }

将产生例如这个输出:

Sleep
0.151834939915548
0.757358826331279
0.786901687225611
0.712520725399457
0.715593741662697
0.798704863327602
0.5724889615859
0.648825479215934
0.436927039609783
0.517873081634677
Threading.Timer
15.5841035662354
14.8620145856526
15.1098812837944
14.4202684978119
15.3883384620112
14.7210748852159
15.307462261265
15.7125416777831
14.5991320125882
15.6035194417168

根据网络,例如comment by Hans PassanttimeBeginPeriod 影响常规 (.net) 计时器。那么为什么我的计时器仍然有这种粗粒度呢? Thread.Sleep 似乎还不错。

可能相关:这在 VMWare 内部的 Windows 7、64 位、.net 4 上运行。

【问题讨论】:

    标签: .net timer sleep


    【解决方案1】:

    评论有误。我的经验是多媒体计时器不会影响 .NET 计时器。也就是说,它不会改变它们支持的最小时间段,这似乎是大约 15 毫秒。它可能会提高它们的准确性。也就是说,如果您要求 16 毫秒,您实际上可能会得到 16 毫秒,而不是“介于 15 到 30 毫秒之间”。

    我不清楚为什么 .NET 计时器被限制为 15 毫秒。

    在接受的答案here中有一些关于它的信息。

    如果您正在为 .NET 寻找更高分辨率的计时器,您可能不应该使用多媒体计时器。这些在 Windows API 中已被弃用。使用定时器队列定时器。看我的文章:

    另一种选择是使用Waitable Timerhttp://www.mischel.com/pubs/waitabletimer.zip

    提供了完整的源代码

    【讨论】:

      猜你喜欢
      • 2019-01-02
      • 1970-01-01
      • 2021-12-25
      • 2020-07-11
      • 2021-10-09
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多