Таймер консольного приложения для вызова веб-методов каждые х минут - PullRequest
1 голос
/ 22 декабря 2010

Я пишу код в VB.Net, VS 2008. Я написал консольное приложение, которое использует 2 веб-метода из приложения веб-сайта.Мне нужно усовершенствовать это консольное приложение, чтобы оно запускало веб-методы непрерывно, возможно, каждые x минут (в рабочее время), но никогда до завершения последнего вызова, продолжительность которого может варьироваться в зависимости от количества учетных записей, которые нужно обработать.

Первоначально я планировал приложение с помощью Task Scheduler, но я думаю, что это не предотвращает два вызова одновременно.

Хотя я видел много сообщений об использовании таймеров, у меня нет 'я не нашел именно то, что мне нужно.

Пока у меня есть:

Dim aTimer As New System.Timers.Timer()
    AddHandler aTimer.Elapsed, AddressOf TriggerWebMethods

' Set the Interval to 10 minutes:
aTimer.Interval = 1000 * 60 * 10            '(1 second * 60 = 1 minute * 10 = 10 minutes)
aTimer.Enabled = True
aTimer.AutoReset = True
  1. Когда следует использовать Timer.Elapsed против Timer.Tick?
  2. Чточем разница между Timer.Enabled против Timer.Start и стоит ли выбирать только один?
  3. Я бы хотел, чтобы 2-й веб-метод запускался, когда первый был сделан.

Я бы хотел сделать это как можно более простым.Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 23 декабря 2010

Если вы имеете дело с System.Timers.Timer, то у вас будет доступно только событие Elapsed.Если System.Windows.Forms.Timer, то вы будете использовать событие Tick.Вы не пишете приложение WinForms, поэтому вы бы использовали System.Timers.Timer.

. Лично я бы использовал свойство Enabled, чтобы узнать, запущен ли таймер.Я бы не использовал его, чтобы начать или остановить.Использование метода Start() или Stop() очень четко показывает, что происходит с таймером.

Если ваши веб-методы выполняются синхронно, вы можете просто вызывать их один за другим в своем методе TriggerWebMethods().Второе не будет вызываться до тех пор, пока не завершится первое.

Sub TriggerWebMethods(source As Object, e As ElapsedEventArgs)
    FirstWebMethod()
    SecondWebMethod()
End Sub

Если асинхронно, вам придется зарегистрировать обратный вызов в первом веб-методе для выполнения второго, когда он завершится.Я полагаю, что в VB вы можете использовать второй непосредственно в качестве обратного вызова, в зависимости от того, как вы делаете асинхронный вызов.(Извините, мой VB сейчас очень ржавый, поэтому может не иметь 100% правильного синтаксиса)

Sub FirstWebMethod()
    ' ...
End Sub

Sub SecondWebMethod()
    ' ...
End Sub

Sub TriggerWebMethods(source As Object, e As ElapsedEventArgs)
    Dim first As Action = AddressOf FirstWebMethod
    first.BeginInvoke(AddressOf SecondWebMethod, first)
End Sub
0 голосов
/ 23 декабря 2010

Просто чтобы немного добавить к ответу Джеффа М. Событие Timer.Elapsed имеет следующее примечание.

Если свойство SynchronizingObject имеет значение null, событие Elapsed имеет значение поднял на тему ThreadPool. Если обработка события Elapsed продолжается больше интервала , событие может быть поднятым снова на другом ThreadPool нить. В этой ситуации событие обработчик должен быть reentrant .

Поскольку вы находитесь в консольном приложении, вы можете либо вручную прокрутить свой собственный SynchronizingObject, либо вы можете установить AutoReset на False и изменить свои TriggerWebMethods, чтобы они начинались в конце. Вы можете даже захотеть сместить интервал, чтобы принять во внимание количество времени обработки.

, например

    Dim start As Date = Now


    'do stuff


    Dim ts As TimeSpan = Now - start

    Dim i As Integer = (1000 * 60 * 10) - ts.TotalMilliseconds

    Dim aTimer As Timers
    aTimer.Interval = i
...