У меня сложный вопрос (для меня как минимум). Я работаю над службой Windows, написанной на VB.net. Я использую класс System.Timers.Timer для периодического вызова метода делегата, чтобы узнать, есть ли какая-либо работа. Время обработки не является критическим, и я попытался предотвратить повторный вход в рабочий метод, отключив Таймер, как только метод будет вызван, и снова запустив его в конце.Marshalling call to main thread from System.Timers.Timer
Однако класс таймера Истекшие события происходят в другом потоке. Поиск в Интернете, большинство людей используют формы Windows, которые реализуют интерфейс ISynchronize, чтобы маршировать вызов назад к исходному потоку. В идеале я не хочу использовать Windows Forms для этого. Есть ли простой способ перенаправить вызов обратно в исходный поток?
В качестве альтернативы есть класс каркаса, который я могу наследовать, чтобы сделать это? Или в худшем случае простая реализация ISynchronize?
Imports System.Timers
Imports System.IO
Imports System.Data
Public Class Application
Implements IDisposable
Private WithEvents _Timer As Timer
Private Sub SleepTimerCallback(sender As Object, e As ElapsedEventArgs) Handles _Timer.Elapsed
' TODO need to find a way to bring this method back on the main thread.
' Temporarily disable the timer elapsed event so that we don't have event re-entrance.
If Me._Timer.Enabled = True Then Me._Timer.Enabled = False
' Do Work.
' Re-enable the timer elapsed event.
_Timer.Enabled = True
End Sub
End Class
Если это все, что вам нужно, то вы, вероятно, не должны использовать службу, а вместо этого простое консольное приложение, которое вы выполняете с помощью запланированной задачи. –