我有一个Asp.Net应用程序,使用svcutil生成的代理调用一些WCF服务。
生成的代理在APM模式(BeginXxx,EndXxx)中具有异步方法。
为了利用新的async/await模式,我使用了async targeting pack,并且我的目标平台是.net 4.0(否则我就不必使用async targeting pack)。
我使用Task.Factory.FromAsync将APM模式转换为可等待的任务。
我的代码看起来有点像这样(假设服务方法不带参数并返回int:
第二行抛出了一个
我认为原因是回调(即在await调用之后运行的所有内容)没有原始同步上下文。
其他方法(如Factory.StartNew)有重载,接收可以用于保留上下文的
FromAsync方法也有重载,它们接收
假设我不想手动将Http上下文作为方法参数传递给此行之后调用的所有方法,那么我该如何使用获取任务调度程序的重载或以其他方式使.Net尊重我的同步上下文?
为了利用新的async/await模式,我使用了async targeting pack,并且我的目标平台是.net 4.0(否则我就不必使用async targeting pack)。
我使用Task.Factory.FromAsync将APM模式转换为可等待的任务。
我的代码看起来有点像这样(假设服务方法不带参数并返回int:
int result = await Task<int>.Factory.FromAsync(proxy.BeginXxx, proxy.EndXxx, state: null);
HttpContext.Current.Items["reuslt"] = result;
第二行抛出了一个
NullReferenceException
。我认为原因是回调(即在await调用之后运行的所有内容)没有原始同步上下文。
其他方法(如Factory.StartNew)有重载,接收可以用于保留上下文的
TaskScheduler
。FromAsync方法也有重载,它们接收
TaskScheduler
,但没有将begin方法作为参数的重载。假设我不想手动将Http上下文作为方法参数传递给此行之后调用的所有方法,那么我该如何使用获取任务调度程序的重载或以其他方式使.Net尊重我的同步上下文?