LoginSignup
1
4

More than 3 years have passed since last update.

【VisualBasic】Taskを用いて非同期にファイル操作【.Net】

Posted at

非同期処理の呼び出し方

本題の前に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: エラー処理について

今回はExceptionfalseにして握りつぶしていますが、実際のコードで使う場合には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

参考にさせていただいた記事

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4