【问题标题】:Async in Asp.net MVC/WebAPIAsp.net MVC/WebAPI 中的异步
【发布时间】:2012-07-24 15:00:26
【问题描述】:

在最近与 MS 的 conf 中鼓励使用 Async 和 Await 关键字,如果我使用 Await 关键字可以跨越一个新线程,代码将在其中执行在这种情况下,Asp.net Worker 线程会发生什么。它会等待请求完成还是会继续为其他请求提供服务。

【问题讨论】:

标签: asp.net asp.net-mvc asp.net-web-api


【解决方案1】:

await 不会产生新线程。请参阅我的async/await intro post 或async/await FAQ。

但是,如果您愿意,可以通过显式调用 Task.Run 来生成新任务。

当您调用await 时,如果您正在等待的对象尚未完成,那么await 将安排您的async 方法的其余部分稍后运行,并将当前线程返回到线程池.在异步操作进行时,async 或 await 未使用任何线程。当异步操作完成时,async 方法的其余部分在线程池线程上运行(可能与它启动的线程相同,也可能不同)。这通常不是问题,因为在常见情况 (1) 中,async 方法会在正确的请求上下文中恢复。

(1) 常见的情况是await 直接在等待Task 或Task<TResult>。

【讨论】:

  • K.但是如果当前线程返回到 Thread pool 中,Thread 中的线程亲和对象会发生什么。例如 HttpContext.Current
  • HttpContext.Current 和其他 ASP.NET 内在函数是请求上下文的一部分,因此当 async 方法恢复时它们会流向新线程。
  • 但是请求上下文对象保存在哪里。它应该需要一些线程上下文来存储,或者需要一些同步上下文来存储它。如果我错了,请纠正我..
  • 请求上下文是 ASP.NET 中SynchronizationContext 的一部分。默认情况下,当您await 和Task 时,当前的SynchronizationContext 在async 方法产生时被捕获,并用于恢复async 方法的其余部分。
猜你喜欢
  • 2014-07-07
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
相关资源
最近更新 更多