【发布时间】:2012-05-23 11:52:50
【问题描述】:
什么 .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等)
- System.Timer
- DispatchTimer
- System.Threading.Timer
- Thread.Join
- .NET 4.0 Task
- Thread.Sleep()
- Monitor.Wait(obj, timespan)
- Multimedia Timers(感谢 Brian Gideon)
- Win32 High Resolution timers
- 还有别的吗?
【问题讨论】:
-
我敢肯定,某种计时器可以完成这项工作; stackoverflow.com/questions/1416803/…。无法保证它会在 精确 N 毫秒内触发,但它们会很接近。
-
精确吗?精确到什么程度?除非您可以限制可接受的抖动,否则根本无法满足您的要求。
-
@MartinJames Precise = 在
interval * 3内,或者在这种情况下为 4.5 秒,尽管我想做得更好(并且认为我什至可以使用 thread.sleep)
标签: c# .net multithreading timer threadpool