В C# Я пытаюсь создать службу Windows с двумя циклами, которые будут выполняться одновременно с установленными интервалами. Например, LoopA будет запускаться каждые 30 секунд и LoopB каждые 5 секунд.Параллельные циклы, выполняющиеся с различными интервалами
Задачи, которые будут выполняться внутри LoopA, могут занять более 30 secodns. Если это произойдет, LoopA начнет снова сразу, где, как если бы задача заняла только 20 секунд, LoopA не будет работать снова в течение 10 секунд.
Я уже реализовал LoopA. Моя проблема теперь заключается в том, что LoopB выполняет параллельную работу, ведя себя так же, как LoopA, за исключением 5-секундного интервала. Вот мой LoopA код, который проходит внутри Тема:
private Thread Worker;
private AutoResetEvent StopRequest;
private TimeSpan loop_a_freq;
private TimeSpan loob_b_freq;
public LoopManager(Thread _worker, AutoResetEvent _stopRequest)
{
// Threads
this.Worker = _worker;
this.StopRequest = _stopRequest;
RunLoopA();
}
private void RunLoopA()
{
DateTime start_current_loop = DateTime.Now;
DateTime next_loop = start_current_loop + loop_a_freq;
for (;;)
{
// Do processing here
new LoopAction();
DateTime now = DateTime.Now;
if (now > next_loop)
{
next_loop = now;
}
TimeSpan delay = next_loop - now;
Thread.Sleep(delay);
next_loop += loop_a_freq;
if (StopRequest.WaitOne(0))
{
return;
}
}
}
Как я могу идти о реализации RunLoopB()
? Темы - это один из аспектов C#, который я никогда не изучал полностью. Нужно ли использовать Parallel.For()
?
У вас есть возможность использовать «Таймер» для планирования ваших задач. Вы можете запускать потоки с заданными интервалами вместо бесконечного цикла, который спит. –
Я сделал, но возникла проблема с тем, что таймер не мог правильно обрабатывать задачи, которые превышают интервал времени (так что если задача 30s фактически заняла 40 секунд). С тех пор моя спецификация дизайна изменилась, поэтому стоит заглянуть в нее. –
Таймер будет запускать новый поток каждый заданный интервал, даже если предыдущий поток еще не закончен. Однако нет ничего, чтобы остановить вас, проверяя переменную в начале задачи «работа», чтобы увидеть, есть ли уже работающая задача, а затем просто возвращается, ничего не делая, если она есть. –