ron*_*y l 4 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;
Run Code Online (Sandbox Code Playgroud)
第二行抛出一个NullReferenceException.
我假设原因是回调(这是在await调用之后运行的所有内容)没有原始同步上下文.
其他方法(如Factory.StartNew)具有接收可用于保留上下文的重载TaskScheduler.
FromAsync方法也有重载,接收a TaskScheduler,但没有将begin方法作为参数.
假设我不想开始手动传递Http上下文作为在此行之后调用的所有方法的方法参数,如何使用获取任务调度程序的重载或以其他方式使.Net尊重我的同步上下文?
我怀疑问题实际上是在ASP.NET管道中,而不是在SynchronizationContext.
Async Targeting Pack支持async/ await支持,但ASP.NET 4.5async中有很多更改使其友好,而Targeting Pack不包含该支持.
尝试使用RegisterAsyncTask(对于Web表单)或AsyncManager(对于MVC)帮助ASP.NET管道.即便如此,管道中仍有一些地方无法使用异步代码(在ASP.NET 4.5中仍然如此,但至少4.5会检测到这一点并抛出错误).
| 归档时间: |
|
| 查看次数: |
1977 次 |
| 最近记录: |