gpt4 book ai didi

c# - 什么线程 sleep 方法最精确 : Monitor. Wait vs System.Timer vs DispatcherTimer vs Threading.Timer

转载 作者:行者123 更新时间:2023-11-30 13:27:31 26 4
gpt4 key购买 nike

什么 .NET 对象(或技术)最精确地每 XXX 毫秒启动一个线程?权衡是什么?

例如:

        int maxDurationMs = 1000;
while (true)
{
DateTime dt = DateTime.UtcNow;
DoQuickStuff()
TimeSpan duration1 = DateTime.UtcNow - dt;
int sleepTime = maxDurationMs - duration1.Milliseconds;
if (sleepTime > 0)
System.Threading.Thread.Sleep(sleepTime);
}

       // CPU Intensive, but fairly accurate
int maxDurationMs = 1000;
while (true)
{
DateTime dt = DateTime.UtcNow;
DoQuickStuff()
while (true)
{
if (dt.AddMilliseconds(maxDurationMs) >= DateTime.UtcNow)
break;
}
}

做同样事情的替代方法,但具有不同程度的准确性和权衡(CPU 等)

最佳答案

我自己从未实际使用过它们,但是 Multimedia Timers据说在 Windows 中的所有计时器服务中具有最佳分辨率。 .NET BCL 还没有此计时器服务的包装器,因此您必须自己执行 P/Invoke 调用。

另一种选择可能是在紧密循环中将 Stopwatch 与一些标准 Thread.Sleep 调用一起使用。我不确定这种方法会给您带来多少好运,但它可能比单独使用普通的旧式 Thread.Sleep 调用更准确。我从未尝试过,但我想任何东西都值得一试。

我做了一些实验,发现将线程优先级更改为 ThreadPriority.Highest 会产生相当大的差异。对于我尝试的每种技术,它都大大降低了间隔的标准偏差。

关于c# - 什么线程 sleep 方法最精确 : Monitor. Wait vs System.Timer vs DispatcherTimer vs Threading.Timer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10609718/

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