1
我有一個控制檯應用程序,它循環訪問隊列並處理數據表中的每條記錄。每個過程都很耗時(連接到遠程網站,下載文件,讀取它們並將它們添加到數據庫中)。我試圖爲了速度而實現線程化,但是遇到了交叉線程問題。 (這項工作需要8小時左右才能運行,直到運行幾個小時纔開始交叉線程。)線程安全,應用程序設計
我想弄清楚如何讓我的代碼線程安全。我不更新或依賴任何非本地變量,並且我不需要返回任何內容。我試過鎖定哪些作品,但是擊敗了多個線程的目的。我還需要尋找其他什麼東西?
Module Module1
Dim iThread As Integer
Dim manualEvents(4) As ManualResetEvent
Private lockObject As New Object()
Sub Main()
' some prep work
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
' some cleaning
End Sub
Private Sub DoOne()
If QueryQueue Then
DoOne()
Else
manualEvents(iThread).Set()
iThread = iThread + 1
End If
End Sub
Public Function QueryQueue() As Boolean
Dim dt As DataTable = GetData()
If dt.Rows.Count > 0 Then
With dt
Dim Variable1 As String = .Rows(0).Item("Variable1")
Dim Variable2 As String = .Rows(0).Item("Variable2")
Dim Variable3 As Integer = .Rows(0).Item("Variable3")
ProcessRecord(Variable1, Variable2, Variable3)
End With
Return True
Else
Return False
End If
End Function
Public Sub ProcessRecord(ByVal Variable1 As String, ByVal Variable2 As String, ByVal Variable3 As Integer)
AnotherMethod(Variable1, Variable2, Variable3)
End Sub
Public Sub AnotherMethod(ByVal Variable1 As String, ByVal Variable2 As String, ByVal Variable3 As Integer)
AnotherMethod2(Variable1, Variable2, Variable3)
End Sub
Public Sub AnotherMethod2(ByVal Variable1 As String, ByVal Variable2 As String, ByVal Variable3 As Integer)
AnotherMethod3(Variable1, Variable2, Variable3)
End Sub
' ... etc.
End Module
可能的重複[使用ThreadPool.QueueUserWorkItem的線程排序](http://stackoverflow.com/questions/1833673/ordering-of-thread-using-threadpool-queueuserworkitem) –
@ 7lan:接受的問題答案我鏈接到應該爲您提供一個完整的實現你正在尋找什麼。如果您想了解更多信息或更全面地瞭解正在發生的事情,我可以給您一個關於我在這個主題上撰寫的博客文章的鏈接。 –
謝謝亞當,我會看看另一個問題。我也很想看到你的博客文章。 – 7Ian