比如我们试图在MVC项目中调用异步的方法:(复习)
client.SendAsync(mail, "success"); client.SendMailAsync(mail);
就会收到这样一个错误消息:
现在无法开始异步操作。异步操作只能在异步处理程序或模块中开始……该异步方法应该返回一个任务,而调用方应该等待该任务。
为什么呢?
我们知道:IIS本身是多线程(复习)的,且一个线程对应(处理)一个Request请求,请求处理完毕发送response到客户端,over,线程回收。
如果我们直接引入异步方法,就很有可能:
要使用异步方法,需要将Action方法改为异步方法,如下:
public async Task<ActionResult> Index() { //……await之前其他代码:准备message/client等 await client.SendMailAsync(mail); //……await之后其他代码 return View(); }这样,await会确保异步方法执行完成之后才继续执行后续代码,生成ActionResult等。
在MVC3以及之前,还需要Controller继承AsyncController
public class RegisterController : AsyncController
如果服务器资源充分,同步异步方法均可立即执行。
PPT演示说明:不考虑异步切换消耗时间,使用异步Action:
假如IIS的所有线程都已经全部耗尽:
PPT演示说明:如果service需要IIS自己处理,IIS仍然没有资源来接收新Request。
异步切换