我是线程的新手,试着去学习它。请不要做任何假设,并尝试解释可能看似显而易见的线程概念和规则。
我有一个模块(静态类)如下:
模块主要
Private ReadOnly _dbConn As SqlClient.SqlConnection
Public ReadOnly Property DBConn() As SqlClient.SqlConnection
Get
Debug.Print("Accessing DBConn")
Return _dbConn
End Get
End Property
Sub New()
_dbConn = New SqlClient.SqlConnection(My.Resources.ConnectionString)
End Sub
结束模块
在整个应用程序中,当我在同一个线程上访问DBConn时,它按预期工作。但是,后来我创建了一个尝试访问DBConn并且没有任何反应的后台工作程序,该线程只是挂起(后台工作程序)。我没有得到打印输出,应用程序不会继续。后台工作线程不会继续超过该点,因此线程永远不会退出。我没有任何异常,我无法在Visual Studio中进行调试(visual studio hangs)。 我想这是一个2部分的问题:为什么我不能从另一个线程访问DBConn,为什么它挂起而不给我一个threadAccess异常?另外,为什么visual studio会挂起(我假设它因为线程悬挂而挂起)?
请注意:我不是在询问练习。我知道我不应该共享相同的连接,而是返回一个新的连接。在这个特定的应用程序中,它是安全的,因为(虽然我在后台线程上执行它)根据应用程序的流程,连接只能一次访问一个。我只是想知道为什么它会挂起来。
答案 0 :(得分:0)
这应该是一个类而不是一个模块。然后,您可以使用引用将连接传递给相应的线程。
例如:
Private myConn as New NameofDataConnectionClass
Private myWorkerClass as New NameofProcessClass
myWorkerClass.DataConnection = myConn
Private thd as New Threading.Thread(AddressOf myWorkerClass.Method)
thd.Start()
显然,这在逻辑上并不是专门编码的。关键是要实例化你的连接类,然后将它传递给线程或后台工作者正在处理的相应类。