投稿者 YUU  (社会人) 投稿日時 2016/9/26 18:15:19
現在下記のコードにてテーブル更新処理を行っております。

    ''' <summary> 
    ''' テーブルデータの削除 
    ''' </summary> 
    ''' <param name="tableName"></param> 
    ''' <returns></returns> 
    Private Async Function DeleteTable(ByVal tableName As StringAs Task

        Try
            Using con As New SqlConnection(strConnection)
                Using cmd As New SqlCommand()
                    Await con.OpenAsync()
                    cmd.Connection = con
                    cmd.CommandText = "DELETE FROM " & tableName
                    cmd.CommandTimeout = 3600
                    Await cmd.ExecuteNonQueryAsync()
                    con.Close()
                End Using
            End Using
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

    End Function

    ''' <summary> 
    ''' BulkCopyを利用したテーブル更新。 
    ''' </summary> 
    ''' <param name="tableName">テーブル名</param> 
    ''' <param name="dt">データテーブル</param> 
    ''' <returns></returns> 
    Private Async Function UpdateTableAsync(ByVal tableName As StringByVal dt As DataTable) As Task

        '対象のテーブルを一括削除。 
        Dim Task1 = DeleteTable(tableName)

        '対象のテーブルにBulkCopy。 
        Dim Task2 = Task.Run(Sub()
                                 Try
                                     Using con As New SqlConnection(strConnection)
                                         Using sqlBulkCopy As New SqlBulkCopy(con)
                                             sqlBulkCopy.DestinationTableName = tableName
                                             sqlBulkCopy.BulkCopyTimeout = 3600
                                             con.Open()
                                             sqlBulkCopy.WriteToServer(dt)
                                             con.Close()
                                         End Using
                                     End Using
                                 Catch ex As Exception
                                     MessageBox.Show(ex.Message)
                                 End Try
                             End Sub)

        Await Task.WhenAll(Task1, Task2)

    End Function



一応、上記のコードにて当方の目的どおり更新されているのですが疑問がございます。

○Task1とTask2の実装方法は適切でしょうか。いろいろ調べているとロック等が必要?。
Task1とTask2は同時に実行されてしまうというような記事を見つけました。削除されていない状態でBulkCopyは使用できないのですが現在は実行できているように見受けられます。WhenAllでの処理待ちはこの場合適切?。

○エラー処理の実装は適切なのでしょうか。デバック時にエラーが表示されず、スルーされているようなのですが。

お知恵お貸ししていただけますと幸いです。