Public Class Service1
Protected
Overrides Sub OnStart(
ByVal args()
As String)
' Очищаем журнал
ClearLog()
WriteLog("Service start"
' Запускаем основной поток
Dim MainThread
As New Threading.Thread(
AddressOf Me.MainThread)
MainThread.Start()
' Запускаем 2 дополнительных потока которые будут генерить события
Dim OtherThread
As New Threading.Thread(
AddressOf Me.Thread2)
OtherThread.Start()
Dim AnyOtherThread
As New Threading.Thread(
AddressOf Me.Thread3)
AnyOtherThread.Start()
End Sub
' Блкоиратор потока
Dim MEvent
As New System.Threading.ManualResetEvent(
False)
' Очередь событий
Dim EventsQueue
As New Generic.Queue(Of EventInfo)
Dim [
Exit]
As Boolean
Sub MainThread()
WriteLog("Main thread started"
' Блокируем блокиратор
MEvent.Reset()
' Выполняем цикл пока не будет установлен флаг Exit (для корректного завершения
' работы сервиса)
Do While Not [
Exit]
' Начинаем ждать разблокировки
MEvent.WaitOne()
' Дождались разблокировки
' Включаем блкоиратор
MEvent.Reset()
WriteLog("Main thread tick"
' Перебираем содержимое очереди событий и обрабатываем их
' В это время очередь событий забловирована поэтому другие потоки которые попробуют
' к ней обратиться тоже будут заблокированы, можно немного передлать этот код чтоб
' очередь не блокировалась
SyncLock EventsQueue
' проходим по всей очереди
Do While EventsQueue.Count > 0
Dim Ev
As EventInfo = EventsQueue.Dequeue
WriteLog("Обработано событие " + Ev.EventName)
Loop
End SyncLock
Loop
WriteLog("Main thread end"
MyBase.
Stop()
End Sub
' Поток которые генерит события
Sub Thread2()
Dim Rnd
As New Random()
WriteLog("Thread2 started"
Do While Not [
Exit]
' Усыпляем поток не некоторое время
System.Threading.Thread.Sleep(500 + Rnd.
Next(1000))
' Создаем событие
Dim Ev
As New EventInfo
Ev.EventName = "одно событие"
Ev.Arguments =
New Object() {DateTime.Now, "гыгыгы"}
' Блокируем очередь и добавляем в нее информацию о событии
SyncLock EventsQueue
EventsQueue.Enqueue(Ev)
End SyncLock
WriteLog("Сгенеро ОДНО СОБЫТИЕ"
' Разблокируем блкоиратор чтоб основной поток мог обработать событие
MEvent.
Set()
Loop
WriteLog("Thread2 stopped"
End Sub
' Поток которые генерит события
Sub Thread3()
Dim Rnd
As New Random()
WriteLog("Thread3 started"
Do While Not [
Exit]
' Усыпляем поток не некоторое время
System.Threading.Thread.Sleep(500 + Rnd.
Next(1000))
Dim Ev
As New EventInfo
Ev.EventName = "другое событие"
Ev.Arguments =
New Object() {10, 20, "hello"}
' Блокируем очередь и добавляем в нее информацию о событии
SyncLock EventsQueue
EventsQueue.Enqueue(Ev)
End SyncLock
WriteLog("Сгенеро ДРУГОЕ СОБЫТИЕ"
' Разблокируем блкоиратор чтоб основной поток мог обработать событие
MEvent.
Set()
Loop
WriteLog("Thread3 stopped"
End Sub
' Для того чтоб корректно остановить основной поток, ставим флаг Exit и разблокируем блокиратор
Protected
Overrides Sub OnStop()
WriteLog("
Stop"
Me.
Exit =
True
MEvent.
Set()
MyBase.OnStop()
End Sub
Protected
Overrides Sub OnShutdown()
Me.OnStop()
End Sub
Public Sub ClearLog()
My.Computer.FileSystem.WriteAllText("c:\service.txt", "",
False)
End Sub
Public Shared
Sub WriteLog(
ByVal text
As String)
My.Computer.FileSystem.WriteAllText("c:\service.txt", DateTime.Now.ToString + " Thread" + _
System.Threading.Thread.CurrentThread.ManagedThreadId.ToString + _
" " + text + ControlChars.CrLf,
True)
End Sub
Class EventInfo
Public EventName
As String
Public Arguments
As Object()
End Class
End Class