svcutilによって生成されたプロキシを使用していくつかのWCFサービスを呼び出すAsp.Netアプリケーションがあります。生成されたプロキシには、APMパターン(BeginXxx、EndXxx)の非同期メソッドがあります。
新しいパターンを活用するために非同期ターゲティングパックを使用していasync/await
ます。ターゲットプラットフォームは.net4.0です(それ以外の場合は、非同期ターゲティングパックを使用する必要はありません)。
Task<T>.Factory.FromAsync
APMパターンを待機可能なタスクに変換するために使用しています。
私のコードは少しそのように見えます(サービスメソッドがパラメータを受け取らず、intを返すと仮定します:
int result = await Task<int>.Factory.FromAsync(proxy.BeginXxx, proxy.EndXxx, state: null);
HttpContext.Current.Items["reuslt"] = result;
2行目は。をスローしNullReferenceException
ます。
その理由は、コールバック(await呼び出しの後に実行されるすべてのもの)に元の同期コンテキストがないためだと思います。
他のメソッド(Factory.StartNewなど)には、コンテキストを保持するために使用できるを受け取るオーバーロードがあります。TaskScheduler
FromAsyncメソッドには、を受け取るオーバーロードTaskScheduler
もありますが、引数としてbeginメソッドを持っているものはありません。
この行の後に呼び出されるすべてのメソッドへのメソッド引数としてHttpコンテキストを手動で渡し始めたくないと仮定すると、タスクスケジューラを取得するオーバーロードを使用するか、同期コンテキストを尊重するために.Netを取得するにはどうすればよいですか?