Выполнение цикла определенное время

88
19 мая 2021, 07:10

мне нужно сделать цикл, который будет длиться 20 секунд. Все это время, будет производиться запрос к БД на проверку значения State. Изначально State = 0, если в течении 20 секунд значение измениться на 1, то выполнится действие 1, если же значение за 20 секунд останется 0, то выполниться действие 2. Помогите, пожалуйста!

Answer 1

Я так понимаю изюмика - сам цикл с датой. Нужно взять текущую дату, записать в переменную. Из текущей даты Now вычитать переменную, в цикле.

var dfrom = DateTime.Now;
int State = 0;
while ((DateTime.Now - dfrom).Seconds < 20) {
   //... ваша проверка
   // System.Threading.Thread.Sleep(100); // Желательно дать возможность работать соседним потокам
   }
//...

Дальше думаю несложно.

Answer 2

Если идет работа с базой (другим сервисом), то тут наверно стоит использовать Task'и, а у них есть такой замечательный помощник, как CancellationToken, который можно попросить отменить задачу после определенного времени.

Вот я сделаю простой пример такой реализации, но хочу заметить, что это все набросал для примера на коленке, но даже такой грубый пример думаю будет понятен:

private bool status = false;
public async Task<bool> CheckStatus ()
{
    var cts = new CancellationTokenSource();
    cts.CancelAfter(TimeSpan.FromSeconds(10));
    var result = false;
    while (true)
    {
        Debug.WriteLine($"[{DateTime.Now}] IsCancellationRequested: {cts.Token.IsCancellationRequested} Status: {status}");
        if (cts.Token.IsCancellationRequested) break;
        if (status)
        {
            result = true;
            break;
        }
        await Task.Delay(TimeSpan.FromSeconds(1));
    }
    return result;
}

Теперь если мы запустим эту задачу (var result = await CheckStatus();), то результатом получим следующий лог:

[08.08.2019 12:42:16] IsCancellationRequested: False Status: False
[08.08.2019 12:42:17] IsCancellationRequested: False Status: False
[08.08.2019 12:42:18] IsCancellationRequested: False Status: False
[08.08.2019 12:42:19] IsCancellationRequested: False Status: False
[08.08.2019 12:42:20] IsCancellationRequested: False Status: False
[08.08.2019 12:42:21] IsCancellationRequested: False Status: False
[08.08.2019 12:42:22] IsCancellationRequested: False Status: False
[08.08.2019 12:42:23] IsCancellationRequested: False Status: False
[08.08.2019 12:42:24] IsCancellationRequested: False Status: False
[08.08.2019 12:42:25] IsCancellationRequested: True Status: False

Видим, что через 10 секунд задача завершилась, статус у нас не изменился и мы отдали false дальше. Вам лишь остается это подправить под себя и грамотно все это реализовать.

READ ALSO
ASP.NET Core PostgreSQL

ASP.NET Core PostgreSQL

Пытаюсь установить PostgreSQL в проект ASPNET Core

145
как привести к нормальному виду pubdate в rss-reader

как привести к нормальному виду pubdate в rss-reader

Делаю rss-reader, не знаю как привести pubdate к виду которому я хочуПо умолчанию pubdate имеет вид "Tue, 06 Aug 2019 00:00:00 +0300"

356
NUnit игнорирует тесты, не запускаем мои тесты

NUnit игнорирует тесты, не запускаем мои тесты

Создал новый проект установил NUnit 312

108
Парсинг JSON ответа при помощи Newtonsoft.JSON [дубликат]

Парсинг JSON ответа при помощи Newtonsoft.JSON [дубликат]

Есть ответ сервера в таком виде (Camunda), хотелось бы выловить id каждого, как сие сотворить даже и не представлюПомогите пожалуйста, буду очень...

232