Я создаю службу Windows в VB.NET, которая будет циклически переходить через набор функций на неопределенный срок, поэтому необходима потоковая обработка. Вы не можете просто запустить цикл в OnStart()
; он должен вернуться к Service Controller.
Моя программа полностью сбой после New DataContext
без каких- либо исключений или чего-то еще.
Я удалил много кода, который кажется мне неактуальным, чтобы лучше видеть основной код проблемы. Я удалил все блоки Try
и изменил типы Meter
типы Object
, поэтому вы можете копировать и вставлять в основном рабочий код.
Я знаю, что это проблема с DataContext и потоками, которые я не понимаю. Здесь обсуждается проблема MultiThreading и DataContext. Что конкретно я делаю неправильно?
Public Class Molly
Dim stopping As Boolean = False
Dim stoppedEvent As Threading.ManualResetEvent
Protected Overrides Sub OnStart(ByVal args() As String)
'vv~~~~ If these two are uncommented, my code fails at an indeterminate place AFTER the New ConfigInterpreter below.
'Dim Example1 As New LocalDBDataContext
'Dim Example2 As New ConfigInterpreter
Threading.ThreadPool.QueueUserWorkItem(New Threading.WaitCallback(AddressOf ThreadWorker))
End Sub
Protected Overrides Sub OnStop()
stopping = True
stoppedEvent.WaitOne()
End Sub
Private Sub ThreadWorker()
Dim MyCI As New ConfigInterpreter '<~~~~ 'My program fails here every time,
'unless the two lines above are uncommented,
'then it fails at a random point after this.
Dim ListOfMeters as List(Of Meter) = MyCI.CompileListOfMeters()
While stopping = False
For Each mtr In ListOfMeters()
mtr.Read()
Next
Threading.Thread.Sleep(My.Settings.CheckIntervalMS)
End While
stoppedEvent.Set()
End Sub
End Class 'Molly
Public Class ConfigInterpreter
Public Sub New()
Try
Dim LocalDB As New LocalDBDataContext '<~~~~~~~ My program typically crashes here.
Catch ex As Exception '<~~~~ No exception is thrown.
End Try
End Sub
Public Function CompileListOfMeters() As List(Of Object)
Dim LocalDB As New LocalDBDataContext
Dim qMeters As IQueryable(Of tblMeter) = From ff In LocalDB.tblMeters
Select ff
Dim ReturnList As New List(Of Object)
For Each mtr In qMeters
ReturnList.Add(mtr)
Next
Return ReturnList
End Function
End Class 'ConfigInterpreter