VB.NET Timer вопрос - PullRequest
       29

VB.NET Timer вопрос

2 голосов
/ 06 мая 2009

Я написал VB.NET Windows Service, который работает нормально. У меня есть только одна проблема с этим. Я хочу, чтобы служба выполнялась в полчаса и в начале часовых отметок (например, 9:00, 9:30, 10:00, 10:30, 11:00 и т. Д. И т. Д.) Я использую следующий код:

Protected Overrides Sub OnStart(ByVal args() As String)
    ' Add code here to start your service. This method should set things
    ' in motion so your service can do its work.
    Dim oCallBack As New TimerCallback(AddressOf TimedEvent)
    oTimer = New System.Threading.Timer(oCallBack, Nothing, 300000, 300000)
    EventLog.WriteEntry("CCFinalizeService has begun successfully." , _
                        System.Diagnostics.EventLogEntryType.Information)

End Sub

Этот код работает, однако, если служба запускается, скажем, в 10:15, то она выполняется в 10:15, 10:45, 11:15, 11:45. Как мне сделать так, чтобы он всегда выполнялся на 30-минутной и верхней части часовых меток?

Ответы [ 4 ]

2 голосов
/ 06 мая 2009

Вы можете изменить его так, чтобы при запуске он вычислял время, необходимое для перехода на полчаса, основываясь на текущем времени. По сути, ваш первый таймер будет <300000, затем переключитесь на каждые 300000. </p>

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

0 голосов
/ 06 мая 2009

Вам просто нужно изменить параметр dueTime в методе создания таймера

Dim now As Date = DateTime.Now
Dim dueTime As Integer ' milliseconds to the next half-hour
dueTime = 1800000 - (now.Minute Mod 30) * 60000 - now.Second * 1000 - now.Millisecond
oTimer = New System.Threading.Timer(oCallBack, Nothing, dueTime, 1800000)
0 голосов
/ 06 мая 2009

Может быть как то так ??

 If Now.Minute <> 0 Or Now.Minute <> 30 Then
    Thread.Sleep((30 - Now.Minute) * 60 * 1000)
 End If
0 голосов
/ 06 мая 2009

Вероятно, самым простым решением было бы проверить при запуске службы текущее время с помощью свойства Date.Now. Затем вы можете использовать второй таймер для запуска первого таймера, но установите интервал на втором таймере так, чтобы он срабатывал только в следующую половину часа или отметку полного часа.

Альтернативно, в вашей подпрограмме запуска есть бесконечный цикл while, который проверяет, находится ли текущее время на вашей отметке. Если нет, System.Threading.Thread.Sleep (1000) и повторите тест.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...