Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
А если сделать лаг в одну секунду и предзагружать изображения? Получится вывод почти точно каждую секунду.
var needSleepMs = sleepMs - watch.ElapsedMilliseconds;
if (needSleepMs > 0 && watch.ElapsedMilliseconds <= sleepMs)
return (int) needSleepMs;
return 0;watch.ElapsedMilliseconds <= sleepMs, так как если watch.ElapsedMilliseconds будет больше sleepMs, то needSleepMs будет меньше нуля, что уже отсекается условием needSleepMs > 0. var needSleepMs = sleepMs - watch.ElapsedMilliseconds;
if (needSleepMs > 0)
return (int) needSleepMs;
return 0; делает именно это. А дальше его можно сократить до return needSleepMs > 0 ? (int)needSleepMs : 0;.return needSleepMs < 0 ? 0 : (int)needSleepMs;Stopwatch.StartNew() возвращает уже запущенный экземпляр и делать watch.Start() не обязательно.class Program
{
static void Main(string[] args)
{
while(true)
{
Task.WaitAll(Task.Run(GetSnapshot), Task.Delay(1000));
}
}
static void GetSnapshot()
{
var rnd = new Random();
var sleepMs = rnd.Next(0, 1000);
Console.WriteLine($"[{DateTime.Now:mm:ss.ff}] DoSomethink {sleepMs} ms");
Task.Delay(sleepMs).Wait();
}
}
00:00.00
00:01.00
00:02.01
00:03.01
...
00:58.42
00:59.42
01:00.43
...
02:13.99
02:15.00 <--- 14.99 + накопленная погрешность
02:16.00
02:17.01
00:00.12
00:01.15
00:02.07
00:03.09
...
00:58.14
00:59.19
01:00.04
...
02:13.18
02:14.23
02:15.11
02:16.14
Можно еше поковырять ThreadPool.RegisterWaitForSingleObject() — он как раз для таких случаев подходит и избавляет от возни с вычислением миллисекунд.
Ну а по коду вот что. Во-первых, в тех местах, где int используется в качестве "столько-то миллисекунд", замените его на человечий TimeSpan. Во-вторых, совсем правильно было бы написать метод, типа PerformPeriodicCallback(Action callback, TimeSpan interval, WaitHandle stopEvent).
int prev = -1, ms;
while (true)
{
ms = DateTime.Now.Millisecond;
if (ms % 1000 == 0 && prev == 999)
Getsnapshot();
prev = ms;
}
Периодическое обновление данных