投稿者 YUU  (社会人) 投稿日時 2016/9/29 15:44:57
返信ありがとうございます。
メソッドを分割する手法をとることにしました。

UIスレッドと非UIスレッドを正しく認識し利用する必要がありそうですね。

>ちなみに,これらをContinueWith使って書き直すのは結構骨が折れます。
>たぶん,こんな感じです (コンパイルすらしていません)。
コンパイルが出来ませんでした。task2~4で怒られます。

task2に関しては、下記で通りました。
        Dim task2 = task1.ContinueWith(Function(t)
                                           Return BulkCopyToTableAsync(tableName, dt)
                                       End Function, TaskContinuationOptions.OnlyOnRanToCompletion).Unwrap()


task3と4はこれらで通りませんでした。
'TaskContinuationOptions.OnlyOnOnlyOnFaultedでエラー?。 
        Dim task3 = task1.ContinueWith(Sub(t) MessageBox.Show(t.Exception.Message), CancellationToken.None, TaskContinuationOptions.OnlyOnOnlyOnFaulted, TaskScheduler.FromCurrentSynchronizationContext())
        Dim task4 = task2.ContinueWith(Sub(t) MessageBox.Show(t.Exception.Message), CancellationToken.None, TaskContinuationOptions.OnlyOnOnlyOnFaulted, TaskScheduler.FromCurrentSynchronizationContext())



また、これら更新メソッドを呼ぶ側にも気になる点がございます。
    Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Button1.Enabled = False
        Loading.Visible = False 'gif表示 

        Dim dt As DataTable = '対象のファイルを読み込みDataTable型で渡す。 
        If dt Is Nothing Then
            Exit Sub
        End If

        Await UpdateTableAsync("TableName", dt)

        Button1.Enabled = True
        LoadingAnime.Visible = False

    End Sub


○buttonイベントで呼び出しているのですが、ボタンの状態offとgifの表示がワンクッション遅れてしまいます。Asyncの特性なのでしょうか?。それとも画面の更新が追いついていないだけでしょうか。