非同期処理の呼び出し方
本題の前にTask
を用いた非同期処理の呼び出し方について軽く触れます(詳しい部分は参考にさせていただいた記事をご参照ください)。
細かな説明は省きますが、今回紹介する方法はTask.Run
にラムダ式を渡すことで処理しています。
Task
の結果は余程の理由が無ければAwait
で取得して下さい。
Booleanを返すタスクの例
Function AsyncFunc() As Task(Of Boolean)
Return Task.Run(
Function() As Boolean
' 何かしらの処理
End Function)
End Function
' Awaitする場合は関数にAsyncを付ける
Async Sub Run()
Dim task As Task(Of Boolean) = AsyncFunc() ' 呼び出し
Dim result As Boolean = Await task ' Awaitで結果取得
Console.WriteLine(result)
End Sub
ファイル操作
以下は1つのファイルをコピーする例です。
ラムダ内でファイルコピーを呼び出しています。
単一ファイルをコピーする例
' SrcFileをDistDirにコピー
Function AsyncCopyFile(ByVal SrcFile As String, ByVal DistDir As String) As Task(Of Boolean)
Return Task.Run(
Function() As Boolean
Try
IO.File.Copy(SrcFile, IO.Path.Combine(DistDir, IO.Path.GetFileName(SrcFile)))
Return True
Catch ex As Exception
Return False
End Try
End Function)
End Function
特定ディレクトリに一括でファイルコピーする場合、以下のように書けます。
一括でファイルコピーする例
Function AsyncCopyFiles(ByVal SrcFiles As List(Of String), ByVal DistDir As String) As Task(Of List(Of Boolean))
Return Task.Run(
Function() As List(Of Boolean)
Return SrcFiles.Select(
Function(ByVal SrcFile As String) As Boolean
Try
IO.File.Copy(SrcFile, IO.Path.Combine(DistDir, IO.Path.GetFileName(SrcFile)), True)
Return True
Catch ex As Exception
Return False
End Try
End Function
).ToList
End Function)
End Function
補足1: エラー処理について
今回はException
をfalse
にして握りつぶしていますが、実際のコードで使う場合にはTuple
を使ったり、結果を表現する型を作って対応すべきだと思います。
補足2: ファイルコピーの別解
一括コピーはTask
の配列を返す形式として以下のように書けないこともないですが、個人的に実験した所紹介した書き方のほうが速かったです。
Taskのリストとする例
Function AsyncCopyFiles2(ByVal SrcFiles As List(Of String), ByVal DistDir As String) As List(Of Task(Of Boolean))
Return SrcFiles.Select(
Function(ByVal SrcFile As String) As Task(Of Boolean)
Return Task.Run(
Function() As Boolean
Try
IO.File.Copy(SrcFile, IO.Path.Combine(DistDir, IO.Path.GetFileName(SrcFile)), True)
Return True
Catch ex As Exception
Return False
End Try
End Function)
End Function).ToList
End Function