【VB】Taskを用いて非同期ファイル操作の続き【.Net】

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