2011-07-25 13 views
1

私はキューをループし、データテーブルの各レコードを処理するコンソールアプリケーションを持っています。各プロセスは時間がかかります(リモート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 
+0

[ThreadPool.QueueUserWorkItemを使用してスレッドの順序付け](0120-998-002) –

+0

@ 7lan:質問に対する受け入れられた回答リンク先には、探しているものを完全に実装する必要があります。もっと詳しい情報が必要な場合や、何が起こっているのかについての徹底的な書きかけ方が必要な場合は、その記事で書いたブログ記事へのリンクを付けることができます。 –

+0

アダムありがとう、私は他の質問を見ていきます。私はあなたのブログの投稿を見ることに非常に興味があります。 – 7Ian

答えて

0

iThread = iThread + 1はスレッドセーフではありません。
代わりにInterlocked.Incrementに電話する必要があります。

.Net 4.0を使用している場合は、ThreadPoolの代わりに新しいTask APIを使用する必要があります。 Task.WaitAllに電話することができます。

関連する問題