Dan*_*man 16 async-await asp.net-mvc-4
我正在编写演示文稿,并认为以下内容应该失败,因为ActionResult没有在正确的上下文中返回.我用VS加载测试它并没有错误.我调试了它,知道它正在切换线程.所以它似乎是合法的代码.
ASP.NET不关心客户端应用程序上的上下文或线程吗?如果是这样,AspNetSynchronizationContext提供了什么目的?我觉得在行动本身中放置一个ConfigureAwait是不对的.这件事似乎有些不对劲.谁能解释一下?
public async Task<ActionResult> AsyncWithBackendTest()
{
var result = await BackendCall().ConfigureAwait(false);
var server = HttpContext.Server;
HttpContext.Cache["hello"] = "world";
return Content(result);
}
Run Code Online (Sandbox Code Playgroud)
ASP.NET没有许多客户端应用程序所需的"UI线程"(由于它下面的UI框架).该上下文不是关于线程关联,而是跟踪页面进度(以及其他事情,例如携带请求的安全上下文)
Windows窗体不是提供SynchronizationContext派生类的唯一环境.ASP.NET还提供了一个AspNetSynchronizationContext,虽然它不公开,不适合外部消费.相反,ASP.NET使用它来促进ASP.NET 2.0中的异步页面功能(有关更多信息,请参阅msdn.microsoft.com/msdnmag/issues/05/10/WickedCode).此实现允许ASP.NET在完成所有未完成的异步调用之前阻止页面处理完成.
有关同步上下文的更多详细信息,请参阅Stephen Cleary去年的文章.
图4特别显示它没有WinForms/WPF的"特定线程"行为,但整个事情是一个很好的阅读.
如果同一应用程序同时完成多个操作,AspNetSynchronizationContext将确保它们一次执行一个.它们可以在任何线程上执行,但该线程将具有原始页面的标识和文化.