アジョブジ星通信

進捗が出た頃に更新されるブログ。

やはり ConfigureAwait のデフォルトはまちがっている。

昨日の

の TL について、 ConfigureAwait のデフォルトが true なのが気に入らないという話をブログにまとめておきます。まぁ所詮 C# 入門者の私の意見だし、いまさら仕様変更されることもないと思うので何言っても仕方ないんですけどね。

await の罠

あのまとめでも挙げられていたので、詳しくは書きませんが、元の SynchronizationContext に強制的に戻ってくるのは少なからずデメリットがあります。

デッドロックの件

ASP.NET での件
http://neue.cc/2013/07/02_412.html

なぜ ConfigureAwait(true) がデフォルトではいけないか

それは例外の本質にあると考えています。

例えば、非同期メソッドを公開するライブラリが ConfigureAwait(false) を指定し忘れた場合、どうなるでしょうか。普通ユーザーは await を使って結果を取得するため、まったく問題なく動作します。しかし、ユーザーが Result や Wait() をしないとは限りません。そのとき初めてデッドロックが発生することに気が付きます。

逆に、 ConfigureAwait(false) がデフォルトで、 UI を扱うコードで true を指定し忘れた場合、 UI にアクセスするコードで必ず例外が発生し、開発者はすぐに気が付き修正することができます。

例外を使って「安全側に転ぶ」とは開発者がプログラムに異常があることにいち早く気づけることだと思います。だから私はよく起こる例外を防ぐのではなく、稀にしか起こらない、とても気づきにくいバグを防ぐ ConfigureAwait(false) をデフォルトにするべきだと考えています。


正直、ストアアプリを増やしたい MS の政治的な部分もありそう……。