Private Sub button1_Click (sender As Object, e As EventArgs) Handles button.Click ' ボタンのハンドラ = UIスレッド button1.Enabled = False lbl.Text = "状況 : ダウンロードを開始します..." If MsgBox( "ダウンロードを開始しますか。", MsgBoxStyle.YesNo Or MsgBoxStyle.Question, "ダウンロードを開始しようとしています。") <> MsgBoxResult.Yes Then lbl.Text = "状況 : ダウンロードを中止しました。" button1.Enabled = True Return End If My.Computer.Audio.PlaySystemSound(System.Media.SystemSounds.Question) backgroundWorker1.RunWorkerAsync(List1.CheckedItems.Cast(Of String)().ToArray()) ' LINQ使ってCheckedItemsをString()に変換して渡す End Sub Private Sub backgroundWorker1_DoWork (sender As Object, e As DoWorkEventArgs) Handles backgroundWorker1.DoWork ' DoWorkイベント = バックグラウンドスレッド Dim checkedItems As String() = DirectCast(e.Argument, String()) Dim numCount As Integer = 0 '連番ファイルカウント Using (wc As New WebClient()) For Each checked As String In checkedItems Dim savePath As String = My.Application.Info.DirectoryPath '保存先 Dim saveFileName = Path.Combine(savePath, "Image" & numCount & Path.GetExtension(checked)) ' 同期ダウンロード wc.DownloadFile(checked, saveFileName) numCount += 1 Next End Using End sub Private Sub backgroundWorker1_RunWorkerCompleted (sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker.RunWorkerCompleted ' 終了ハンドラ = UIスレッド If e.Error IsNot Nothing Then lbl.Text = e.Error.Message txtLog.Text &= vbCrLf & "・エラーが発生しました。" & vbCrLf & "エラーメッセージ:" & e.Error.Message & "スタックトレース:" & e.Error.StackTrace TabControl.SelectTab(1) txtLog.Select(0, 0) Else lbl.Text = "状況 : ダウンロードが完了しました。" End If button1.Enabled = True End Sub