wrongwrongな開発日記

情報系大学院生の忘備録

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

wrongwrong163377.hatenablog.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