我正在编写一个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