C# 多等待场景中的HTTPContext

C# 多等待场景中的HTTPContext,c#,asp.net-mvc-4,asynchronous,c#-5.0,C#,Asp.net Mvc 4,Asynchronous,C# 5.0,我正在编写一些MVC4异步控制器代码,遇到了一个问题,即我异步调用了两个长时间运行的web服务,而第二个调用似乎位于错误的线程上 以下是代码片段: public async Task<ActionResult> AmendDetails(Model model) { ClientMaintenanceClient clientService = new ClientMaintenanceClient(); UpdateResponse clientResponse

我正在编写一些MVC4异步控制器代码,遇到了一个问题,即我异步调用了两个长时间运行的web服务,而第二个调用似乎位于错误的线程上

以下是代码片段:

public async Task<ActionResult> AmendDetails(Model model) 
{
    ClientMaintenanceClient clientService = new ClientMaintenanceClient();
    UpdateResponse clientResponse = await clientService.GetForUpdateAsync(clientService.CreateRequest(model.Id));

    StaticDataEnquiryClient staticService = new StaticDataEnquiryClient();
    DataResponse staticResponse = await staticService.GetPayMethodsAsync(staticService.CreateRequest());

    ...
}
我猜我需要在第二次等待之前在某个地方同步一些东西,但我不确定是什么。

您的代码肯定会工作。既然你提到MVC3,我就假设这是一个升级的项目。在这种情况下,请确保web.config中包含以下内容:

<appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>


在ASP.NET中,线程的工作方式与GUI应用程序不同。您的第二个调用应该在正确的上下文中执行,设置了
HttpContext
。(换句话说,我不知道你的代码出了什么问题。)嗯。。。是的,这很有效。它做了什么?MSDN声明
“对于启用WebSocket的应用程序、在Web表单页面中使用基于任务的异步以及某些其他异步行为,必须设置此兼容性开关。”
这是某些其他异步行为吗?老实说,我无法100%确定为什么您的代码在新的(任务友好型)应用程序之间工作方式不同
AspNetSynchronizationContext
和旧的
legacyapsnetsynchronizationcontext
。我怀疑对于旧版来说,它完成请求的时间太早了——但我认为
async
MVC控制器会阻止这一点。。。
HttpContext.Current.Session.SessionId
<appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>