2009-04-25 1 views

ответ

8

Является ли ваша служба реальной услугой или просто приложением WCF, которое контролирует папку XML?

В случае, если ваша служба WCF является обычным приложением, самым простым способом является использование функции «Запланированные задания» в Windows (найдено на панели управления). Просто попросите приложение проверить папку при запуске и установить запланированную задачу, которая запускает приложение в любое время.

Если целевое приложение является реальной службой Windows, вам необходимо использовать внутренний таймер. Посмотрите на класс System.Timers.Timer.

public void OnLoad() { 
    Timer timer = new Timer(); 

    // Add event handler 
    timer.Elapsed += WorkMethod; 

    // Give us more control over the timer. 
    timer.AutoReset = false; 

    SetupTimer(timer); 
} 

// Setups the timer for the next interval and starts it. 
private void SetupTimer(Timer timer) { 
    timer.Interval = GetNextChecktime().Subtract(DateTime.Now).TotalMillisecond; 

    timer.Start(); 
} 

private void WorkMethod(object sender, EventArgs e) { 
    // Do work here 

    // Setup the timer for the next cycle. 
    SetupTimer((Timer)sender); 
} 

private DateTime GetNextChecktime() { 
    // Return the next time the service should run as a datetime. 
} 

Причина использования SetupTimer вместо использования AutoReset = истина, которая будет повторяться автоматически, чтобы синхронизировать таймер с GetNextChecktime(). Просто используя 24 * 60 * 60 * 1000 миллисекунд, поскольку прошедший таймер даст 24-часовую фазу, но вам нужно будет запустить скрипт в 01:00, чтобы он работал ежедневно в 01:00.

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

+0

что, если моя служба ФОС это веб-сервис –

2

Если вам нужно запускать службу только один или два раза в день (или даже один раз в неделю), я бы создал консольное приложение и планировал его запуск в указанное время с помощью «Запланированных задач Windows». Таким образом, только сама система Windows будет проверять, было ли уже получено «правильное» время, чтобы разбудить ваш сервис и выполнить обработку.

Если у вас есть служба, которая должна работать круглосуточно и, например, только обрабатывать сообщения в течение заданного периода времени, то может оказаться, что ваша служба Windows (NT), которая работает в фоновом режиме, запускается на сервере без входа пользователя в систему и может выполнять всевозможные действия, например, проверять время, чтобы увидеть, нужно ли ему работать, а если нет, он может продолжать спать :-)

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

Марк

+0

Можно ли запланировать консольное приложение таким образом, что он не отображает окно при выполнении? В этом случае я сомневаюсь, что не должно быть никого, кто видел бы это 01:00, - но просто из любопытства. Кажется, я пробовал это в какой-то момент без большой удачи. –

+0

Я, по собственному опыту, подумал, что если вы не НАПИСАЛИ на Консоль, используя Console.Write/WriteLine, никакой видимой консоли вообще не будет. Так что да, я думаю, вы должны иметь полностью «невидимое» консольное приложение, работающее в 1 утра утром :-) –