やはり ConfigureAwait のデフォルトはまちがっている。
昨日の
の TL について、 ConfigureAwait のデフォルトが true なのが気に入らないという話をブログにまとめておきます。まぁ所詮 C# 入門者の私の意見だし、いまさら仕様変更されることもないと思うので何言っても仕方ないんですけどね。
なぜ ConfigureAwait(true) がデフォルトではいけないか
それは例外の本質にあると考えています。
例えば、非同期メソッドを公開するライブラリが ConfigureAwait(false) を指定し忘れた場合、どうなるでしょうか。普通ユーザーは await を使って結果を取得するため、まったく問題なく動作します。しかし、ユーザーが Result や Wait() をしないとは限りません。そのとき初めてデッドロックが発生することに気が付きます。
逆に、 ConfigureAwait(false) がデフォルトで、 UI を扱うコードで true を指定し忘れた場合、 UI にアクセスするコードで必ず例外が発生し、開発者はすぐに気が付き修正することができます。
例外を使って「安全側に転ぶ」とは開発者がプログラムに異常があることにいち早く気づけることだと思います。だから私はよく起こる例外を防ぐのではなく、稀にしか起こらない、とても気づきにくいバグを防ぐ ConfigureAwait(false) をデフォルトにするべきだと考えています。
意識せずに同期と同じように非同期を扱える、って売り文句からするとConfigureAwait(true)がデフォルトなの致しかたない気はする
— くっきー (@nk9k) April 30, 2015
正直、ストアアプリを増やしたい MS の政治的な部分もありそう……。