我正在尝试在 VB 中运行一个多线程控制台应用程序,并且正在线程交叉。基本上我想运行 5 个线程,让它们不断访问队列、处理和重复,直到没有任何东西为止。当所有线程都处理完毕后,我希望他们做其他事情。我正在尝试使用 SyncLock 来防止多个线程访问,但它似乎不起作用。任何帮助,将不胜感激!
Dim iThread As Integer
Dim manualEvents(4) As ManualResetEvent
Sub Main()
For i = 0 To 4
manualEvents(i) = New ManualResetEvent(False)
ThreadPool.QueueUserWorkItem(AddressOf DoOne)
Next
For Each handle As WaitHandle In manualEvents
handle.WaitOne()
Next
' do other stuff
EndSub
Private Sub DoOne()
Dim lockObject As New Object()
SyncLock (lockObject)
If QueryQueue.DoOne() Then
DoOne()
Else
manualEvents(iThread).Set()
iThread = iThread + 1
End If
End SyncLock
End Sub
最佳答案
问题在于锁定的资源,您使用 lockObject 作为同步锁定资源,它应该在线程中共享。
您必须将其设为实例字段。
Private Shared lockObject As New Object()
Private Sub DoOne()
SyncLock (lockObject)
If QueryQueue.DoOne() Then
DoOne()
Else
manualEvents(iThread).Set()
iThread = iThread + 1
End If
End SyncLock
End Sub
关于vb.net - VB.Net 中的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6778823/