我正在編寫一個VB.net 2017 Windows服務,它查看SQL並根據行數來創建多個線程。這些線程監視文件夾並將其報告回不同的表並相應地記錄數據。這段代碼已經運行了幾年,並且運行得非常好,但在過去的幾天裏,我決定將它從啓動時運行的控制檯應用程序切換到窗口服務,這是我第一次寫一個Windows服務。調用從線程連接到數據庫的Sub
我已經通過並獲得了代碼工作,但測試是一個主要的痛苦,因爲我無法通過代碼。我做了一些修改併合並了一些重複部分。例如,我正在編寫4或5個不同的代碼段,以便將數據寫入SQL或從SQL中提取數據。我將它們合併爲只有2個子例程,並且這些線程不斷使用它們。根據情況,程序可以有1-15個線程,當我開始激活更多線程時,我開始遇到問題。在移植它之前,我已經在控制檯應用程序的代碼中嘗試了一些聲明,並且在創建新程序時我只是將它們放到了一個日誌表中,而且它正在抱怨我試圖打開「打開連接」。下面是從SQL中提取數據一個例程的一個例子:
Public con As New SqlClient.SqlConnection
Public dsGeneral As New DataSet
Public dc1 As SqlClient.SqlCommand
Public pullGeneral As SqlClient.SqlDataAdapter
Public maxRowsGeneral As Integer
Public Sub PullGeneralSQL(ByVal SQL As String)
Try
If (con.State = ConnectionState.Closed) Then
con.Open()
End If
dsGeneral.Tables.Clear()
pullGeneral = New SqlClient.SqlDataAdapter(SQL, con)
pullGeneral.Fill(dsGeneral, "General")
maxRowsGeneral = dsGeneral.Tables("General").Rows.Count
Catch ex As Exception
Msg(ex.Message, "Error")
maxRowsGeneral = 0
End Try
con.Close()
End Sub
我也收到錯誤說連接已經關閉爲好。我假設另一個線程完成了連接,並在線程處於任務中間時關閉了連接。
我的問題是,處理這個問題的最好方法是什麼?
您是否只需要一個線程一次打開數據庫連接?如果是這樣,那麼你可能想在打開和關閉連接的代碼周圍使用'SyncLock',一次只限制一個線程。否則,請確保您在連接字符串中啓用了「MultipleActiveResultSets」。 – jmcilhinney
是否有最多15個線程? – EJD
jmcihinney - 我基本上想要一個線程來打開連接,做它的事情,然後關閉連接。我在想,每個線程都可以獨立連接,不會引起對方的問題。 – dbooher2011