Как справиться с повторяющимся исполнением? - PullRequest
3 голосов
/ 14 мая 2010

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

private AutoResetEvent autoResetEvent = new AutoResetEvent(true);
private bool isRunning = true;

public void Execute()
{
    while(isRunning)
    {
       DoSomething();

       if(isRunning)
       {
         autoResetEvent.WaitOne(new Timespan(0, 10, 0));
       }
    }
}

public void Stop()
{
    isRunning = false;
    autoResetEvent.Set();
}

Непосредственные потенциальные проблемы, которые я вижу, состоят в том, что я не делаю никакой блокировки вокруг модификации isRunning в Stop (), которая вызывается другим потоком, но я не уверен, что мне действительно нужно? Худшее, что я думаю, может случиться, это то, что он запускает один дополнительный цикл.

Кроме того, есть ли очевидные проблемы с этим кодом? Есть ли лучший способ решить эту проблему, о которой я не знаю?

Ответы [ 4 ]

7 голосов
/ 14 мая 2010

Вы можете попробовать использовать System.Threading.Timer:

Timer tmr = new Timer(DoSomething, null, new TimeSpan(0, 0, 0), new TimeSpan(0, 10, 0))
1 голос
/ 14 мая 2010

Это не будет запускаться каждые 10 минут; это будет очень близко к каждые 10 минут, если DoSomething - быстрый процесс. Следующий запуск произойдет через 10 минут после завершения DoSomething.

Вы можете использовать планировщик заданий, например Quartz.Net .

0 голосов
/ 14 мая 2010

А как насчет использования Windows Workflow Foundation? Я думаю, что он довольно ориентирован на такие задачи.

Вы можете запустить appruntime через вашу программу, а затем позволить приложению WWF позаботиться обо всем.

0 голосов
/ 14 мая 2010

Один из лучших способов - использовать что-то вроде Windows Server AppFabric, в которое встроены понятия повторяющихся задач, обработки ошибок и управления. Вы просто пишете нужный код. К сожалению, сегодня это самое передовое, но я бы выбрал именно такую ​​разработку.

...