kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

Visual Studio 11の.NET Framework 4プロジェクトでasyncを使う

C# 5.0のasync/await構文は言語の機能で、コンパイラががんばっているシンタックスシュガーです。実際は.NET 4のTaskクラスを使って生成されます。岩永さんのところが分かりやすい。
非同期処理 (C# によるプログラミング入門)
Taskクラス使うんだったら、.NET Framework 4.5じゃなくても.NET Framework 4プロファイルでも使えていいんじゃね?ってことかどうか知りませんが、提供されたのがAsync Targeting Pack for Microsoft Visual Studio 11です。
Download Async Targeting Pack for Visual Studio 2012 from Official Microsoft Download Center
これはホワイトペーパーで、実際のものはNuGetでとってきてください。このAsync Target Packを使って.NET Framework 4ターゲットのプロジェクトを作ると、.NET Framework 4しかインストールされていない環境でもasync/awaitを使ったバイナリが動くという優れもの。実際にやってみましょう。

.NET Framework 4でプロジェクトを作ります。

async/awaitを書いても、.NET Framework 4なのでIDEがエラーを出しています。

そこで、NuGetからAsync Targeting Pack for Microsoft Visual Studio 11を追加します。

.NET Framework 4プロジェクトなのにasync/awaitがエラーにならなくなりました。ただし、無条件にいいことばかりではありません。リリースノートに注意書きがあります。細かいところはあるけど、Visual Studio 11のデバッガはasyncのステップ実行をサポートしないって点が大きいですかね?
async/awaitのために.NET Framework 4.5で追加されたメソッドはTaskExっていうクラスで提供されるようですね。ほかにも実装が変わるので、このパッケージを使って.NET Framework 4環境で実行する場合はこの辺の細かい挙動の差を知っておいたほうがいいですね。