Как сделать такую ​​задержку, которая не применяется к конкретной операции только в первый раз. Но она должна применяться позже? C # - PullRequest
0 голосов
/ 13 марта 2019

У меня была функция, которая обновляла базу данных каждую секунду (как непрерывно поступающие данные из какой-то сети), я хотел поставить задержку на эту функцию обновления. Как она будет обновлять таблицу базы данных каждые 5 минут. Вот мой код

 if (ip==StrIp)
{
Task.Delay(300000).ContinueWith(_=> 
{                        //I'm Using Task.Delay to make delay

var res= from i in dc.Pins //LINQ Query
where i.ip== ip
select i;
for each (var p in res)
{
p.time= System.DateTime.Now,
p.temperature= temp,
.
. //some other values
. 
};
datacontext.submitChanges();

});
}

Он работает и обновляет данные каждые 5 минут. Теперь я хочу, чтобы данные обновлялись сразу только при первом запуске приложения, но после этого они должны обновляться через каждые 5 минут. Но сейчас мойкод этого не делает .. Как я могу сделать такую ​​задержку, которая игнорирует операцию в первый раз, но применяется к предстоящим итерациям данных?Заранее спасибо

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Вы можете использовать флаг, чтобы определить, вызывается ли ваш метод впервые, например ::

.
private uint _counter = 0;
public YourMethod()
{
    if (ip == StrIp)
    {
        Action<Task> action = _ =>
        {
            var res = from i in dc.Pins //LINQ Query
                      where i.ip == ip
                      select i;
            //...
            datacontext.submitChanges();
        };

        if (_counter++ == 0)
            action();
        else
            Task.Delay(300000).ContinueWith(action);

    }
}
0 голосов
/ 13 марта 2019

Извлеките внутреннюю логику задачи в функцию / метод (рефакторинг VS или R # может к этому автоматически) и вызовите новую функцию / метод при запуске и включении.интервал.

Лично я бы пошел в другом направлении:

Иметь очередь в памяти, которая заполняется данными по мере их поступления в ваше приложение.Тогда у меня будет поток / задача и т. Д., Который проверяет очередь каждые 5 минут и соответственно обновляет базу данных.Не забудьте заблокировать очередь для обновлений (параллелизм). ConcurrentQueue .Net является одним из способов сделать это.

...