2011-03-18 15 views
0

最近、VB.netでマルチスレッドの基本を学びました。大きなリストのレコードを処理し、SQLデータベースに1つずつ挿入していきました。 私はこのようなコードを見てみましょう:マルチスレッド処理の問題

Private Sub btnLoadNow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoadNow.Click 

    Dim autoLoad1 As New Thread(AddressOf AutoLoad) 
    autoLoad1.Start() 

    Dim autoLoad2 As New Thread(AddressOf AutoLoad) 
    autoLoad2.Start() 

    Dim autoLoad3 As New Thread(AddressOf AutoLoad) 
    autoLoad3.Start() 

    Dim autoLoad4 As New Thread(AddressOf AutoLoad) 
    autoLoad4.Start() 

    Dim autoLoad5 As New Thread(AddressOf AutoLoad) 
    autoLoad5.Start() 


    Dim autoLoad6 As New Thread(AddressOf AutoLoad) 
    autoLoad6.Start() 

    Dim autoLoad7 As New Thread(AddressOf AutoLoad) 
    autoLoad7.Start() 

    Dim autoLoad8 As New Thread(AddressOf AutoLoad) 
    autoLoad8.Start() 

    Dim autoLoad9 As New Thread(AddressOf AutoLoad) 
    autoLoad9.Start() 

End Sub 

Private Sub AutoLoad() 

for each Item as Record In ItemLists 
    Process Codes 
Next 

End Sub 

Itemlists iがデータベースから取得したグローバルリストで、すべてが私には正常に見えるが、私はこのプログラムを実行すると、私はスレッドがに1つのレコードが9回を挿入していることがわかりましたデータベース(私は合計で9つのスレッドを持っている)、私はおそらく私は具体的に各スレッドにリストの1/9を割り当てる必要があると思う?リストの分割を必要としない別の方法がありますか?そうでない場合は、分割してどのように割り当てますか?いかなる援助も歓迎されるだろう。

答えて

0

スレッドを作成するオーバーヘッドが、最初にスレッドを回転させることで得られる利点を上回るため、1つのスレッドに1つのスレッドを作成しません。ただし、共有変数を使用してSyncLockを使用すると、並行性を維持できます。

'Replace List(Of String) with your type. 
Public Shared ItemList As New List(Of String) 

これは通常、競合のメモリ上の更新に使用される:質問をコメントに

編集。あなたの最初のスレッドは、あなたの例ではすべての処理を常に終わらせます。いくつかのスレッドを回転させて作業を分割したい場合は、各スレッドに名前を割り当ててから、それぞれのスレッドに異なる作業を割り当てるためのロジックをプロシージャに持たせてください。

+0

私はループコード内にsynclockを持っています。共有変数を使用する例を教えてください。ありがとう。 – miketonny