私はキューをループし、データテーブルの各レコードを処理するコンソールアプリケーションを持っています。各プロセスは時間がかかります(リモートWebサイトへの接続、ファイルのダウンロード、読み込み、データベースへの追加)。私は速度のためのスレッドを実装しようとしているが、クロススレッドの問題を抱えています。 (ジョブを実行するには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を使用してスレッドの順序付け](0120-998-002) –
@ 7lan:質問に対する受け入れられた回答リンク先には、探しているものを完全に実装する必要があります。もっと詳しい情報が必要な場合や、何が起こっているのかについての徹底的な書きかけ方が必要な場合は、その記事で書いたブログ記事へのリンクを付けることができます。 –
アダムありがとう、私は他の質問を見ていきます。私はあなたのブログの投稿を見ることに非常に興味があります。 – 7Ian