User1454 Ответов: 2

Что является лучшим способом периодического вызова функции в службе windows, отличной от timer в C#


Привет,
Мне нужно периодически вызывать функцию (с временем запуска и интервалом) в приложении службы windows. Кроме таймера и планировщика задач windows, есть ли лучший способ? Пожалуйста, предложите.Спасибо.

Что я уже пробовал:

Возможно ли это с помощью асинхронной задачи?

2 Ответов

Рейтинг:
2

Suvendu Shekhar Giri

Лучший способ-использовать резьбу для достижения такого требования.
-- создать нить
-- убедитесь, что одновременно работает только один поток
-- выполните необходимую операцию
-- после завершения операции спящий поток на время, указанное в интервале
-- повторите процесс
-- также проверьте, не происходит ли в данный момент какая-либо операция при остановке службы, и соответственно дождитесь ее завершения

Попробуйте этот подход. Если вам понадобится более подробная информация о реализации этого подхода, пожалуйста, дайте мне знать.

Надеюсь, это поможет :)


Рейтинг:
0

Hermann Jung

Не знаю, соответствует ли он вашим требованиям. Но для меня это работает.

public void InitJob() 
{
    Action job = () => { Console.WriteLine($"Running {DateTime.Now}"); };
    Func<DateTime> computeNextStart = () => 
    {
        var now = DateTime.Now;
        return now.Date 
               + TimeSpan.FromHours(now.Hour) 
               + TimeSpan.FromMinutes(now.Minute + 1);
    };
    ThreadPool.QueueUserWorkItem(
        (state) => ExecuteJobTimedAsync(job, computeNextStart));
}

private static async void ExecuteJobTimedAsync(
    Action job,
    Func<DateTime> computeNextStart) 
{
    DateTime waitUntil = computeNextStart();
    TimeSpan wait = waitUntil - DateTime.Now;
    if (wait > TimeSpan.Zero) await Task.Delay(wait).ConfigureAwait(false);
    job();
    ThreadPool.QueueUserWorkItem(
        (state) => ExecuteJobTimedAsync(job, computeNextStart));
}

Пример выполняет задание каждую полную минуту (см. computeNextStart), в то время как задание не занимает больше минуты.