投稿者 るきお  (社会人) 投稿日時 2023/11/16 13:34:23
> Awaitがあるので、別スレッドで動いているタスクの終了を待つ
Await はその名前に反して、タスクの終了を待ちません。
Await に到達した時点で直ちに呼び出し元に実行が戻ります。

呼び出し元では
_taskMain.Wait()

のように Wait が使われているので、ここで呼び出し元は実行を停止して、別タスク(_taskMain)の終了を待ちます。

以上が、このようなプログラムを書くプログラマーがよく想定しているシナリオで、実際にそのように実行されることもあります。
一方で、別タスクで実行する処理が元タスクがAwait や Waitに到達するよりも速く完了する場合などもありますから、第2・第3のシナリオもあります。そうであっても、VB側でうまく面倒を見てくれるのでプログラマーはこのような状況を区別する必要は通常ありません。

>では元々のスレッドはAwaitしている間は何をしているのか、呼び出し元のコードを実行しているのか? 
よくあるシナリオの場合、Wait() で「待て」と命令しているので、それを素直に実行します。
つまり、呼び出し元コードは何もしていません。

本来はWaitではなく、何かここに別の処理を記述することで、それぞれの処理が同時を進ませることができます。
今回は学習用のプログラムのようなので、あまり意味がない構造になっているのかなと思いました。

いただいたプログラムは下記で説明しているプログラムに近いので、よろしければ参考にしてください。
https://www.umayadia.com/VBStandard2/Standard43.htm#A3_5

なお、非同期処理はとても難しく、サンプルレベルではうまく動いているように見えても実践ではさまざまな問題が発生することがよくあります。熟練のプログラマーでなければ使いこなせません。実用の際にはご注意ください。