Azure WebSites の .NET Framework が 4.5.1 にアップデートされました。

Azure WebSites の .NET Framework が、4.5 から 4.5.1 にインプレースアップデートされたみたいですね。うちのテナントのインスタンスも確かめなくちゃ。ちなみに、この情報は、しばやん大先生のブログ記事を見つけてくれた、うちの会社の若い子によります。ありがとう。若い子!

何が重要かって、TransactionScope の async/await インフラストラクチャ対応ですよ。Entity Framework 6 の DbContext が非同期実行に対応しているのに対し、TransactionScope は対応していなかったんです。

具体的には、await される度にどのスレッドで再開されるかわからないのが async/await です(実際は、WPFだとUIスレッドに戻ってきたり、ASP.NETだとどのスレッドかわからないけど HttpContext は同一だったりし、フレームワークに合ったコンテキストの保ち方をします)。しかし、EF5 までの DbContext も、.NET 4.5 までの TransactionScope もスレッド依存だったんですね。TransactionScope に関しては、ライフサイクルをスレッドで管理していたようで(おそらく)、await に対応するには、SyncrhonizationContext で管理する必要があると考えられます。おそらく 4.5.1 からそれに対応できたのでしょう。TransctionScope コンストラクタのパラメータに、非同期対応を行うか同課のパラメータが追加されました。ちなみに、.NET 4.5.1 は、Windows Server 2012 R2 にはインストールされているので、ずいぶん前にリリースされています。

しかし、ちょーお手軽 PaaS (IIS の間貸し)である Azure WebSites は、ベースOSがWindows Server 2012 のまま。.NET Framework だけアップデートしようにも、IaaS ではないので、対応を待つしかありませんでした。そして、いつの間にか更新されていました。

TransactionScope が async/await に非対応なら、それ相当の書き方があるのでいいっちゃいいんですが、ようは、トランザクション区間に入って出るまでを1スレッドで実行しなくちゃいけないので、せっかくの async/await インフラストラクチャもタスクパケットの占有時間が長いわけです。CPU時間がもったいないことになるのです。

さて、これで心おきなく Entity Framework と TransactionScope で async/await できるぞ!

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中