私は現在、Microsoft.Bcl.Async と .NET 4.0 を使用して、VS 2012 で記述されたコードを VS 2010 で動作させようとしています。VS 2010 では、Async CTP (ver. 3) をインストールしました。 V S2012 で書かれたプロジェクトをコンパイルできます。
Async CTP パックを動作させるのにかなり苦労した後、VS 2012 と VS 2010 の両方でプロジェクトをコンパイルできるようになりました。
ただし、実行時のコードの動作にはいくつかの違いがあります。私が実行しているコードを以下に示します。
public class Fetcher
{
public string RunTask()
{
Task<string> task = TaskEx.Run(() => RunTaskAsync());
return task.Result;
}
public async Task<string> RunTaskAsync()
{
await TaskEx.Delay(1);
return "Hello";
}
}
基本的に、私が持っているのは非同期メソッドであり、クライアントがメソッドの非同期バージョンまたは同期バージョンのいずれかを呼び出すことができるように、同期ラッパーが必要です。
問題: VS 2012 からコードを実行すると、両方のメソッドが結果 "Hello" を返し、さらに重要なことに、両方のメソッドが適切に終了します。ただし、VS 2010 からコードを実行する場合は、話が大きく異なります。async メソッドは意図したとおりに機能しますが、sync ラッパー メソッドは単にハングし、結果が生成されません。
私は TPL と async/wait の概念にかなり慣れていないので、ここで見られる動作を説明するのに苦労しています。Async CTP には、私が認識していない何らかの制限がありますか、それとも概念的に間違った方法でこれを行っていますか?