等待Task.Factory.FromAsync(BeginXxx,EndXxx)后,HttpContext为null

时间:2012-08-19 18:55:14

标签: c# wcf asynchronous task-parallel-library async-await

我有一个Asp.Net应用程序,它使用svcutil生成的代理调用某些WCF服务。 生成的代理在APM模式中具有异步方法(BeginXxx,EndXxx)。

我正在使用异步定位包以利用新的async/await模式,而我的目标平台是.net 4.0(否则我不必使用异步定位包)。

我正在使用Task<T>.Factory.FromAsync将APM模式转换为我可以等待的任务。

我的代码看起来有点类似(假设service方法不带参数并返回int:

int result = await Task<int>.Factory.FromAsync(proxy.BeginXxx, proxy.EndXxx, state: null);
HttpContext.Current.Items["reuslt"] = result;

第二行抛出NullReferenceException

我假设原因是回调(在await调用之后运行的所有内容)没有原始同步上下文。

其他方法(如Factory.StartNew)的overloads接收TaskScheduler,可用于保存上下文。

FromAsync方法也有overloads接收TaskScheduler,但没有一个将begin方法作为参数。

假设我不想手动将Http上下文作为方法参数传递给在此行之后调用的所有方法,如何使用获取任务调度程序的重载或以其他方式使.Net尊重我的同步上下文

1 个答案:

答案 0 :(得分:5)

我怀疑问题实际上是在ASP.NET管道中,而不是SynchronizationContext

Async Targeting Pack支持async / await,但有a lot of changes in ASP.NET 4.5 to make it async-friendly,而定位包不包含该支持。

尝试使用RegisterAsyncTask(对于Web表单)或AsyncManager(对于MVC)帮助ASP.NET管道。即便如此,管道中仍有一些地方不能使用异步代码(在ASP.NET 4.5中仍然如此,但至少4.5会检测到这一点并引发错误)。