Я реализую алгоритм связи для отправки информации периодически и очень быстро, то есть 1 мс между пакетами. У меня есть функциональная версия, которая использует Tasks для отправки пакетов. Вот пример моего кода:Как ввести точную небольшую задержку в задаче без перегрузки процессора?
private void Work()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
while (!cancellationTokenSource.Token.IsCancellationRequested)
{
if (!Pack.PeriodicOn)
cancellationTokenSource.Cancel();
// Time used to send the packs before the interval time
double tolerance = Pack.Interval * 0.2F;
// In case of interval bigger than 25ms send pasks only 5ms before
if (tolerance > 5) tolerance = 5;
TimeSpan timeSpan = stopwatch.Elapsed;
// The waiting time is controlled by the condition below, if the condition is false, the while loop continues execution
// Send the information a little bit before to interval time to deal with the transmision delay
if (Pack.LastSent.TotalMilliseconds == 0 ||
timeSpan.TotalMilliseconds - Pack.LastSent.TotalMilliseconds >=
(Pack.Interval - tolerance))
{
SendData(Pack);
Pack.LastSent = timeSpan;
}
}
Pack.LastSent = new TimeSpan(0);
}
Моя проблема основывается в том, что увеличивается использование процессора к нежелательному уровней. Я знаю, что я могу избежать этого, введя некоторую задержку, но, Thread.Sleep (1) очень неточен и реальный интервал передачи между пакетами увеличивается, если я использую wait.Delay (1), похоже, дает тот же эффект.
Есть ли у кого-нибудь альтернативный способ ввести, точно, задержать задачи?
Заранее благодарен!
Windows не является оперативной ОС:/ –
Другие ответы SO, например. http://stackoverflow.com/questions/6254703/thread-sleep-for -less-than-1-millisecond, похоже, говорит, что вращение процессора, как вы делаете, - это путь. –
Было бы полезно понять, что вы подразумеваете под «очень неточным». Сколько различий вы видите? Какой интервал таймера вашей системы (по умолчанию - 15 мс) – EricLaw