【发布时间】:2012-07-24 15:00:26
【问题描述】:
在最近与 MS 的 conf 中鼓励使用 Async 和 Await 关键字,如果我使用 Await 关键字可以跨越一个新线程,代码将在其中执行在这种情况下,Asp.net Worker 线程会发生什么。它会等待请求完成还是会继续为其他请求提供服务。
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-web-api
在最近与 MS 的 conf 中鼓励使用 Async 和 Await 关键字,如果我使用 Await 关键字可以跨越一个新线程,代码将在其中执行在这种情况下,Asp.net Worker 线程会发生什么。它会等待请求完成还是会继续为其他请求提供服务。
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-web-api
await 不会产生新线程。请参阅我的async/await intro post 或async/await FAQ。
但是,如果您愿意,可以通过显式调用 Task.Run 来生成新任务。
当您调用await 时,如果您正在等待的对象尚未完成,那么await 将安排您的async 方法的其余部分稍后运行,并将当前线程返回到线程池.在异步操作进行时,async 或 await 未使用任何线程。当异步操作完成时,async 方法的其余部分在线程池线程上运行(可能与它启动的线程相同,也可能不同)。这通常不是问题,因为在常见情况 (1) 中,async 方法会在正确的请求上下文中恢复。
(1) 常见的情况是await 直接在等待Task 或Task<TResult>。
【讨论】:
HttpContext.Current 和其他 ASP.NET 内在函数是请求上下文的一部分,因此当 async 方法恢复时它们会流向新线程。
SynchronizationContext 的一部分。默认情况下,当您await 和Task 时,当前的SynchronizationContext 在async 方法产生时被捕获,并用于恢复async 方法的其余部分。