下記のコードを複数回実行した結果が次のようになりました。1回目の実行で、08行めのConsoleWrite文が機能しません。2回目以後では、同じ数値が重複して表示されます。12行目をWriteLineからWriteに変えると、一切表示されなくなります。MicroSoftのDocsによるとConsoleクラスは、スレッドセーフとなっていますが、08行目のWrite文が欠落する理由はなんでしょうか?非同期プログラムの勉強を始めたばかりで、判らないことばかりなので、あまりにも初歩的な質問で申し訳ありません。どなたか?詳しい方いらっしゃいましたら教えてください。Studioの出力ウィンドウに出ているということでいいでしょうか。12行目をWriteLineからWriteに変えると、一切表示されなくなります。行終端記号の出力の有無が原因でしょうか?出力ウィンドウへの出力の場合、改行文字が現れない間は出力がバッファリングされます。1回目の実行で、08行めのConsoleWrite文が機能しません。前述のようにバッファリングされているので、まだ出力ウィンドウに表示されていない状態です。2回目以後では、同じ数値が重複して表示されます。前回までの実行でバッファリングされた状態の文字列が出力されています。08行目のWrite文が欠落する理由はなんでしょうか?先述の通り、欠落しているのではなく、後回しにされています。スレッドを起動するのはいくらかコストがかかるものです。Task.Factory.StartNewを呼び出したからといって直ちにその中に書かれた処理が開始するわけではありません。スレッドを起動中にも元々のスレッドの処理は継続します。Task.WhenAll(tasks)WhenAllメソッドは、「tasksの各処理が全部終わったら、完了状態となるTask」を用意しろというメソッドです。WhenAll自体は特に何かを待つわけではありません。End")ここでEndが出力ウィンドウに渡されます。1回目のButton1_Clickでは、各Taskが起動しConsole.Writeが呼び出されるよりも先に、Console.WriteLineが呼び出されています。次回以降のButton1_ClickでConsole.WriteLineが行われるまでウィンドウには出てきません。1回目はEndが真っ先に出力されるのに2回目以降はいくつかその回のConsole.Writeが出力される点については、Task.Factory.StartNewが標準で使用するスレッドプールという仕組みに原因を求められますが、そこは一旦置いておいてもいいかと思います。Task)の全Taskの完了後に特定処理を実行したい場合、Task.WhenAllが返してきたTaskの完了後にその処理を実行する必要があります。以前はContinueWithを使って記述する必要がありましたが、最近は「Taskの完了後に処理をする」というのを手軽に書けるようになりました。SubAsyncは「このメソッド内でAwaitキーワードを使うよ」という宣言です。「以降の処理を、Taskが完了した後で実行するように」という意味合いになります。本当に、多くの時間を割き、丁寧なご回答ありがとうございます。ご指導頂いたことにより、次のような整理ができました。仰る通りに出力ウィンドウに表示しています。改行がないと出力されないことを知りませんでした。WhenAllがUIスレッドを止めるもの(WaitAllと勘違い)と捉えていました。今回の例では、UIスレッドを止めても問題が無かったので、awaitを使うことは考えていませんでしたが、ご指導を頂いて、awaitを使うだけで全てが解決しました。キーバッファとバッファを混同して考えていました。今回教えて頂いたことにより、WhenAll,WhenAny,WaitAll,WaitAny,awaitなどについての概念が整理できました。今回感じたことは、園庭で、多くの幼稚園児が自由に遊んでいるのを監視するような気持で、対応する必要があるなぁ?って思いました。習得の道は長いと思いますが、このように上級者から丁寧な指導を得られることを幸せに感じ頑張ります。近いうちに、初歩的な質問をすると思いますが、宜しくお願い致します。仰る通りに出力ウィンドウに表示しています。即時出力されるようになります。クラスの利用を検討してみてください。ファイル等への出力も可能です。