2015を使用しています。async/awaitを用いた非同期処理を始めて実装しようとしているのですが、Windowsフォームアプリケーションで作成したコードでTask.WaitAllが実行されていない?実行完了しても抜けない?問題に悩まされています。処理が5分ほどかかる複数の処理を同時並列し、すべて終わるまで待つというコードを作成しようとしており、処理をひとつづつtaskListに格納し、Task.WaitAll(taskList.ToArray());で一度に実行することを意図しています。下記のコンソールアプリケーションではタスクC,D,E,F,Gを非同期で実行し、すべての処理完了後、WaitAllを抜けます。AとBをシリアルに実行したあと、C-Gを同時に、非同期で実行できることが確認できます。Applicationに組み込だのですが、Task.WaitAll実行後処理が次に進みません。C-Gが実行されないように見えます。Applicationの場合になにか足りないのでしょうか。Applicationの場合は動いていただけなのでしょうか。Applicationと同じ)もしご存知の方がいらっしゃいましたらよろしくお願いします。21:38:28)一般論として、GUIアプリケーションにおいてWaitを含むコードを実行することは推奨できません。最終的にはasyncなイベントハンドラでawaitする形を取るようにします。お書きのコードにおける具体論として。RunTestを呼び出すとUIスレッドでExecuteLongWorkが実行されるわけで、「UIスレッドで時間のかかる処理をしてはいけない」という原則に従っていません。Task.WaitAllも同様です。Taskを使う場合、入り口まですべてTaskをチェーンすることが望ましいです。RunTestAsync()に。ExecuteLongWorkAsync(...)に。Task.WhenAll(...)に。ts.RunTestAsync(...)に。最後に、なぜ実行が停止するかの解説を。RunTest時点では実行スレッドはUIスレッドであり、そこでExecuteLongWorkAsyncを呼び出しています。ExecuteLongWorkAsyncもUIスレッドで動作します。ここでTask.Runした後awaitしていますが、UIスレッドから実行したTaskをawaitすると、await以降の処理はUIスレッドで実行されることになります。実現手段としては、UIスレッドで回っているメッセージループに対してメッセージをPOSTしています。各ExecuteLongWorkAsyncが開始された後、RunTestはUIスレッドですべてのTaskの完了を待ちます。UIスレッドはここで一旦停止します。resultを実行できません。resultできないので、taskListにAddしたTaskはいつまで経っても完了せず、Task.WaitAllはいつまで経っても終わりません。このように見事なデッドロックが成立してしまっているのです。13:48:59)Hongliangさん、ありがとうございます。具体的なご指導に加えて丁寧な解説までいただき感激しています。UIスレッドの中で非同期処理をするのには注意が必要とのこと承知しました。(非同期処理の理解確認用なのでいろいろツッコミどころはあるのは承知しています)。>>このトピックに書きこむ入力内容にタグは利用できません。他人を中傷する記事は管理者の判断で予告無く削除されます。半角カナは使用しないでください。文字化けの原因になります。名前、コメントは必須記入項目です。記入漏れはエラーになります。入力内容の一部は、次回投稿時の手間を省くためブラウザに記録されます。自動的にリンクされます。一般論として、GUIアプリケーションにおいてWaitを含むコードを実行することは推奨できません。最終的にはasyncなイベントハンドラでawaitする形を取るようにします。お書きのコードにおける具体論として。RunTestを呼び出すとUIスレッドでExecuteLongWorkが実行されるわけで、「UIスレッドで時間のかかる処理をしてはいけない」という原則に従っていません。Task.WaitAllも同様です。Taskを使う場合、入り口まですべてTaskをチェーンすることが望ましいです。RunTestAsync()に。ExecuteLongWorkAsync(...)に。Task.WhenAll(...)に。ts.RunTestAsync(...)に。最後に、なぜ実行が停止するかの解説を。RunTest時点では実行スレッドはUIスレッドであり、そこでExecuteLongWorkAsyncを呼び出しています。ExecuteLongWorkAsyncもUIスレッドで動作します。ここでTask.Runした後awaitしていますが、UIスレッドから実行したTaskをawaitすると、await以降の処理はUIスレッドで実行されることになります。実現手段としては、UIスレッドで回っているメッセージループに対してメッセージをPOSTしています。各ExecuteLongWorkAsyncが開始された後、RunTestはUIスレッドですべてのTaskの完了を待ちます。UIスレッドはここで一旦停止します。resultを実行できません。resultできないので、taskListにAddしたTaskはいつまで経っても完了せず、Task.WaitAllはいつまで経っても終わりません。このように見事なデッドロックが成立してしまっているのです。解決したらチェックしておきましょう。