投稿者 ツェナー  (社会人) 投稿日時 2023/11/16 17:03:33
ご教示いただきありがとうございます。

>呼び出し元は実行を停止して、別タスク(_taskMain)の終了を待ちます。
>呼び出し元コードは何もしていません。
>本来はWaitではなく、何かここに別の処理を記述することで、それぞれの処理が同時を進ませることができます。

私がここに載せた記述ではどのように動作するのか、分かりました。
呼び出し元でもどこでも書いたとおりにしか動かないということですね。

また、MainAsyncを呼び出している部分は、
Private ReadOnly _taskMain As Task = MainAsync()
       
        '(省略)  

_taskMain.Wait()

となっていたと申しましたが、確認したところ、これはMainAsyncメソッドを使用する処理を終了する際のみ、呼び出されるように書かれており、通常はClassManagerのインスタンスを生成した際に、MainAsyncは定期的に実行されるようになっているということでした。
(MainAsyncは、定期的な実行でデータをデバイスに読み書きしており、内部メモリに書き込みデータがある場合はデバイスにデータを書き込み、読み込んだデータが必要な際は、MainAsyncが内部メモリに保存した読み込みデータを持って行くという動作をするということでした。)

特に学習用というプログラムではありませんが、確認が足らず、Waitして呼んでいる部分を呼び出しの際は全てそれを使っていると勘違いしておりました。

また、デッドロックについて、
Private Sub AsyncTest()

    Debug.WriteLine("A")

    DoNotDoThisAsync().Wait()

    Debug.WriteLine("B")

End Sub

Private Async Function DoNotDoThisAsync() As Task

    Debug.WriteLine("C")

    Await Task.Run(Sub()
                       Debug.WriteLine("D")
                   End Sub).ConfigureAwait(False)

    Debug.WriteLine("E")

End Function

とすれば動作できるとのことでしたが、呼び出し元のプログラムは、別スレッドのAwaitしている処理が終了したところで、呼び出し元のプログラムをその別スレッドに移すことでWaitから抜けられるという理解で宜しいでしょうか。

度々申し訳ございませんが、よろしくお願いいたします。