【发布时间】:2017-06-27 06:29:48
【问题描述】:
我正在寻找任何计时器的设计,它可以安排周期小于 1 毫秒的任务。 最佳方案:加载 1 个核心的 25%,当 1 个单独的线程用于运行时这种模式。
1 毫秒是所有计时器的限制,我知道:
- System.Windows.Forms.Timer
- System.Timers.Timer
- System.Threading.Timer
我已经实现了计时器,它每 X 微秒运行一次任务。但是,当使用 1 个单独的线程来运行此模式时,它仍然几乎加载了一个内核。
代码:
private readonly TimeSpan _period;
private readonly Stopwatch _stopwatch;
private TimeSpan _lastElapsedTime;
private Double _iterationsPerPeriod;
void Run()
{
TimeSpan elapsed = _stopwatch.Elapsed;
TimeSpan interval = elapsed - _lastElapsedTime;
if (interval < _period)
{
Int32 iterationsToWait = (Int32) (_iterationsPerPeriod * (interval.TotalMilliseconds / _period.TotalMilliseconds));
Thread.SpinWait(iterationsToWait);
}
_lastElapsedTime = _stopwatch.Elapsed;
// RunTask();
}
void RunTimer()
{
while(true)
{
Run();
}
}
如何在不加载 CPU 的情况下每 X 微秒运行一次方法?
【问题讨论】:
-
您可以使用任务并行库。见msdn.microsoft.com/en-us/library/dd537609(v=vs.110).aspx........但是你需要使用.Net 4.0或以上版本
-
不确定是否可以。 Windows 无法以这种速度切换您的线程,因此您的线程将仍在运行并消耗 CPU 时间。
-
@SureshKumarVeluswamy,谢谢。这似乎是一个替代方案。使用 TPL 将导致每秒多次分配。
-
@xanatos 它可以在 CPU 进行切换之前暂停 CPU 一段时间(这主要发生在定时器中断上,所以没问题),但这只会帮助使用电源,而不是其他正在运行的线程系统上。然后你必须等待其他线程放弃 CPU 才能再次运行,这根本不会发生。
标签: c# performance scheduled-tasks scheduling