STAではブロッキングしてはならない

公開:2012-04-03 20:58
更新:2020-02-15 04:37
カテゴリ:windows 8,ppl/concrt

非同期操作が作成したタスクを含め、PPL のあらゆるタスクで、get を呼び出すのが "構文的には" 適切です。ただし、結果が使用できるようになるまでは、get は呼び出し元のスレッドをブロックする必要があり、当然ながら「速くて滑らかに」という合言葉と矛盾します。そのため、タスクで get を呼び出すことは一般に推奨されず、STA では禁止されています (ランタイムは "invalid operation" (無効な操作) の例外をスローします)。get を呼び出せるのは、継続タスクのパラメーターとしてタスクを取得したときに限られます。

引用元:非同期プログラミング - PPL を使用した C++ での非同期プログラミング.

taskテンプレートのget()はブロッキングするのでSTAでは例外で落ちる(継続タスクのパラメーターとしてタスクを取得した時以外)。これは仕様である。WinRT+PPLの世界ではユーザーへのレスポンスを速めるためにブロッキングを排除しなければならない。シングルスレッドなので当然といえば当然なのだが。

非同期処理はコールバックベースのわかりにくいコードになりがちだが、PPLを使うとすっきりと読みやすいコードが書ける。