gpt4 book ai didi

.net - 尽管有 timeBeginPeriod(1),为什么最小 Threading.Timer 间隔为 15ms

转载 作者:行者123 更新时间:2023-12-04 14:58:27 27 4
gpt4 key购买 nike

下面的片段

    [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 Passant , timeBeginPeriod 影响常规 (.net) 计时器。那么为什么我的计时器仍然具有这种粗粒度? Thread.Sleep 似乎做得很好。

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

最佳答案

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

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

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

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

另一种选择是使用 Waitable Timer .完整的源代码可在 http://www.mischel.com/pubs/waitabletimer.zip 获得。

关于.net - 尽管有 timeBeginPeriod(1),为什么最小 Threading.Timer 间隔为 15ms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16160179/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com