次の理由から、VS2012 と Async ターゲット パックが最適なオプションです。
- 構文は C#5 と同じであるため、C#5 へのアップグレードが容易になります。Async CTP には十分な違い (Task クラスの代わりの TaskEx、Task サフィックスの代わりの TaskAsync、トークン パラメーターなど) があり、アップグレードが面倒です。難しいことではなく、ただの迷惑です
- Await/async の動作が大幅に改善され、C#5 に近づきました。Async CTP では、ループ内で例外が発生すると、ループ全体が暗黙のうちに失敗します。この影響を受けるシナリオについては、「タスクを再試行する」を参照してください。
- インストールの問題はありません。問題を回避するには、Async CTP と VS 2010 SP1 を特定の順序でインストールする必要がありました。
- ターゲット パックについては MS から何らかのサポートが期待できますが、Async パックについては何も期待できません。
小さな注意点として、VS2010 + Async CTP を搭載したマシンに VS2012 をインストールすると、Async CTP が壊れます。VS2010 バージョンを使用して Async コードをコンパイルすることはできなくなります。
非同期動作が重要な例として、タスクを再試行する次の非常に簡単な方法を考えてみましょう。この関数は Async CTP でコンパイルされますが、例外が発生すると、サイレントに失敗します(アプリケーションのサイレント終了の場合と同様)。
private static async Task<T> Retry<T>(Func<T> func, int retryCount)
{
while (true)
{
try
{
var result = await Task.Run(func);
return result;
}
catch
{
if (retryCount == 0)
throw;
retryCount--;
}
}
}
そうは言っても、私は Async CTP を 1 年以上使用していますが、唯一の問題は、Visual Studio 2010 SP1 を追加した後のインストール順序でした。順序を間違えると、Asycn CTP はインストールされず、SP1 を削除してすべてを正しい順序で再インストールする必要があります。
それでも、複数のコード バージョンと煩わしい例外動作を回避するために、2012 に移行し、ターゲット パックが実用的になり次第 (つまり、チーム全体が切り替える準備ができたら) 移行します。