xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

非同期メソッド入門 (12) - .NET Framework 4.5以外でawaitする

async/awaitはC# 5.0で搭載されたキーワードです。このキーワードを使ったコードのコンパイルを通すには、Visual Studio 2012で.NET Framework 4.5をターゲットとする必要があります。ここまでの連載は、すべてそう設定されていることを前提として紹介してきました。しかし、Visual Studio 2012の標準では.NET Framework 4.5以外もターゲットとして設定できます。.NET Framework 4やSilverlightでは非同期メソッドは利用できないのでしょうか?今回はそこについて見て行きましょう。

利用へのアプローチ

Visual Studio 2012に搭載されているC#のコンパイラはC# 5.0のキーワード解釈が可能なものです。このコンパイラは、Visual Studio 2012を使ってさえいれば、ターゲットプラットフォームに関わらず利用されます。また、非同期メソッド入門 (7) - 内部実装を覗くでも紹介したように、async/await構文は.NET Framework 4.5で追加されたいくつかのクラスライブラリ群を利用した記述方法とのシンタックスシュガーです。つまり、Visual Studio 2012 (=C# 5.0対応のコンパイラ) を利用し、かつasync/await構文のコンパイルが通るだけのクラスライブラリ群を追加しさえすれば、.NET Framework 4.5以外をターゲットにしていても非同期メソッドを利用できるということです。

Microsoft.Bcl.Async

「非同期メソッドの威力/恩恵をこれまでのプラットフォームにも!」ということで、Visual Studio 2012 + .NET Framework 4.5以外の環境下で非同期メソッドを利用するための追加ライブラリ、「Microsoft.Bcl.Async」がリリースされました。リリースのアナウンスはこちら。

Using async/await without .NET Framework 4.5

これまでもAsync Targeting Pack for Visual Studio 2012が公開されていましたが、これはその後継として位置付けられているものです。ライブラリは、NuGetから取得することができます。

Microsoft.Bcl.Async

Microsoft.Bcl.Asyncがカバーしているプラットフォームは、Async Targeting Pack for Visual Studio 2012のそれより広範になっています。赤字の部分が新たに追加になったプラットフォームです。

  • .NET Framework 4
  • Silverlight 5
  • Silverlight 4
  • Windows Phone 7.5
  • Portable Class Library

また、これまでAsync Targeting Pack for Visual Studio 2012はWindows XPとWindows Vista上での動作をサポートしていませんでしたが、Microsoft.Bcl.Asyncにはそのような制約はなさそうです。開発プラットフォームの拡大だけでなく、動作プラットフォームも増えたということで、既存プロジェクトへの採用もしやすい環境が整ったと言えるでしょう。

ただし、Microsoft.Bcl.Asyncと.NET Framework 4.5標準とのソースコードの互換性は100%ではありません。例えば.NET Framework 4.5ではTaskクラスに実装されているものもTaskExクラスで表現しているなど、追加ライブラリとしての制約はやはりあります。Async Targeting Pack for Visual Studio 2012のものにはなりますが、リリースノートにその相違点/比較表が載っています。利用上の注意として、ご一読すると良いかと思います。

Microsoft.Bcl.Async。現時点ではまだプレビュー版としてのリリースしか行われていませんが、非同期メソッドの恩恵は極めて大きいので、ぜひ旧来の環境でも利用してみてください!

2013年4月20日 (土) : 追記

2013年4月18日 (日本時間)、Microsoft.Bcl.Asyncが遂に正式公開されました!

Microsoft.Bcl.Async is Now Stable

これまでのRC版とはdllの構成などが異なるようで、アップグレードする場合には注意が要りそうです。以前はRC版ということで業務などでの採用を見送っていたケースもあるかもしれませんが (私はそうでした)、これで心置きなく利用することができます。皆さんも、幸せな非同期生活を!

2013年6月23日 (日) : 追記

.NET Framework 4でもasync/awaitを利用できる非常にありがたいMicrosoft.Bcl.Asyncですが、全幅の信頼がおける訳ではありません。僕自身、現在業務でどうしてもXPサポートが必要でVisual Studio 2012 + .NET Framework 4 + Microsoft.Bcl.Asyncで開発をしていますが、いざリリースしようして以下のような問題に現在進行形でハマっています。

  • .NET Framework 4を入れただけでは動かない
  • ClickOnceによる配布ができない

このようなトラブルはMicrosoft側も認識しているようで、解決策が提示されていました。

Async Targeting Pack Overview

上記の障害はこれのTroubleshootingセクションのIssue 8 / Issue 9を参考にすれば解決できそうです。ご利用の際はいくつかの問題があることをキチンと把握して使いましょう!(把握せずに使った罰を受けている感...)