JoeSmith3100
@JoeSmith3100
Начинающий программист C#

Какие есть способы выполнять определённое действие каждую секунду?

допустим у нас есть цикл:

while(true) 
{
	... место для кода ...
}


как в нём задать команду "если прошла секунда - сделать действие"?

P.S. находить миллисекунды от начала работы проги и проверять не оставляют ли они остаток от деления на 1000 - не вариант, цикл с большой долей вероятности "перескочит" момент когда количество миллисекунд окажется равным остатку от деления на 1000
  • Вопрос задан
  • 1231 просмотр
Решения вопроса 3
borisdenis
@borisdenis
Ленив и вреден...
А кто мешает использовать обычный таймер?
https://metanit.com/sharp/tutorial/11.9.php
Ответ написан
@d-stream
Готовые решения - не подаю, но...
Можно в цикле проверять, но не равенство, а условно "приблизительность" - например что модуль разницы меньше некоей дельты. Можно просто больше чем запланированное время (время прошлого выполнения плюс интервал).
Для систем, которые не носят приставки "реального времени" - это все всегда будет примерным.
Или можно пойти иным путем - например таймер и по его событию выполнять действия.
Ответ написан
Комментировать
1. Таймер
using System;
using System.Threading;
using System.Threading.Tasks;
{
  Console.WriteLine("Сейчас стартанёт таймер");
  // Стартанёт таймер через секунду и он будет тикать каждые 3 секунды
  using var timer = new Timer(_ => Console.WriteLine("Tick!"), null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(3));
  await Task.Delay(TimeSpan.FromSeconds(10));  
}
Console.WriteLine("Таймер больше не тикает");
await Task.Delay(TimeSpan.FromSeconds(10));
Console.WriteLine("В чём мы и убедились");

2. Task.Delay
var cts = new CancellationTokenSource();
var cancellationToken = cts.Token;
Console.WriteLine("Сейчас начнёт тикать, но через 10 секунд перестанет");
cts.CancelAfter(TimeSpan.FromSeconds(10));
var task =  Task.Run(async () =>
 {
     while (!cancellationToken.IsCancellationRequested)
     {
         cancellationToken.ThrowIfCancellationRequested();
         Console.WriteLine("Tick!");
         await Task.Delay(TimeSpan.FromSeconds(3), cancellationToken);
     }
 }
);
try {await task;} catch(OperationCanceledException){}
Console.WriteLine("Больше не тикает");
await Task.Delay(TimeSpan.FromSeconds(5));
Console.WriteLine("В чём мы и убедились");


Вариант с таймером лично мне нравится больше.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
If (<= условие)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы