2019/10/6追記
書き直しました。
qiita.com
改良点
前回の記事では色々とまとめた結果粒度が小さくなってしまっていたので、粒度を上げてみました。
ソースコード
outside6.wp.xdomain.jp
公開後に上記記事を見つけたので修正を行いました。修正内容は、Task.Resultで待機するのではなく、Awaitで待機することでメインスレッドが止まらないようにしたことです。
CopyFileでファイルコピーを開始し、Awaitで処理を待機しています。
今回はCopyFileでExceptionを握りつぶすような形としています。戻り値を構造体やクラス、Tupleなどにして沢山情報を返すこともできるでしょう。
Private Function CopyFile(ByVal FilePath As String, ByVal CopyTo As String) As Task(Of Boolean) Return Task.Run( Function() As Boolean Try IO.File.Copy(FilePath, CopyTo & IO.Path.GetFileName(FileName)) Catch ex As Exception '何かミスった Return MsgBox(ex.Message, MsgBoxStyle.OkOnly) <> MsgBoxResult.Ok 'メッセージが閉じられたときfalseを返す End Try Return True End Function) End Function Private Async Sub TestMethod(ByVal FilePaths() As String, ByVal CopyTo As String) Dim taskList As New List(Of Task(Of Boolean)) For Each FilePath As String In FilePaths 'ファイルコピー開始 taskList.Add(CopyFile(FilePath, CopyTo)) Next For Each t As Task(Of Boolean) In taskList If Await t Then ' 結果を見て何かしらの処理 End If Next End Sub