DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォームイベントで開始したスレッドの終了を同期させたい

環境/言語:[VB.NET2005/.NET Framework2.0 ]
分類:[.NET]

フォルダからテキストファイルを取得して、csvデータをデータベースに書き込む
プログラムを作成しています。

1.フォルダからテキストファイル名を取得します。
2.ファイル名一覧をリストBOXに表示します。
3.リストBOXに表示されたファイル名を取得して、テキストのインポートをします。
4.テキストファイルは13万行あるので、中止ができるようにスレッドを使います。
5.ファイルリストの上から順に自動的にテキストをDBにインポートしたい。
6.スレッドは、2.0から使用できる BackgroundWorkerを使いました。

上記の動作を実現するために、リストBOX、ボタンをフォーム上に配置し、
下記のコードを記述しましたが、フォームのイベントが先に走ってしまい
BackgroundWorkerが複数起動してしまいエラーが発生します。
mutexを使えばいいかもと思いましたが、スレッド間ではない為、使用方法がわかりません。
ご教授をよろしくお願いいたします。

コード
Private Sub Cmd_FileInput_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cmd_FileInput.Click
Dim i As Integer = 0

Try
'データの挿入 ファイル名+現在の日付
For i = 0 To ListBox1.Items.Count - 1
'テキストファイル名の取得
FileName = ListBox1.Items(i)
' 別スレッドでのデータの取込を開始
Me.BackgroundWorker1.RunWorkerAsync()
Next i

Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub

' このメソッドは別スレッドで実行される
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim Reader As New IO.StreamReader(FileName, System.Text.Encoding.Default)
Dim Line As String = Reader.ReadLine 'CSVの一行
Dim Cnt As Integer = 0

Try
Do Until IsNothing(Line)

'テキストファイルからDBへインポートする処理

Line = Reader.ReadLine '次の行を読み込む。
Cnt = Cnt + 1

Loop
'テキストの読み込みを終了
Reader.Close()

Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
ファイル名のコレクションを BackgroundWorker に渡してやり、RunWorkerAsync 自体の呼び出しは一回限りにするようにしましょう。
ファイル名のコレクションは、フィールドを通して渡すより、RunWorkerAsync の引数として渡し、DoWorkEventArgs の Argument で受け取る方が分かりやすいです。

DOBON.NET | プログラミング道 | プログラミング掲示板