[英]Calling an async method from the browser
根据我的理解, 当我们使用await并且等待的任务尚未完成时,执行将返回给调用者 。 它在服务器端工作正常(从服务器端方法本身调用异步方法)。 但是当我从UI调用异步方法时会发生什么。
public class TestController : ApiController
{
IList<string> lstString = new List<string>();
public async Task<IList<string>> GetMyCollectionAsync()
{
lstString.Add("First");
string secString = await GetSecondString(); // I am expecting a response back to UI from here.
lstString.Add(secString);
lstString.Add("Third");
return lstString;
}
private async Task<string> GetSecondString()
{
await Task.Delay(5000);
return "Second after await";
}
}
我用浏览器中的上述API测试过
,但是我的UI中只有5秒后才收到回复。 我错误地思考了吗?
我错误地思考了吗?
是。 async-await
不会改变HTTP协议的性质,HTTP协议的类型是请求 - 响应。 在ASP.NET控制器中使用async-await
,使用async方法不会产生对调用者的响应,它只会将请求线程返回给线程池。
但如果这是真的,那么在控制器端使用具有单个等待的异步方法是没有用的。 对? 因为它花了相同的同步调用时间
当您需要可伸缩性时,异步会闪耀。 它不是“尽可能快地产生这种响应”,它是关于能够处理大量请求而不会耗尽线程池。 一旦线程开始执行IO工作,而不是被阻止,它将被返回。 因此,能够提供更多的请求。
异步本身并没有使任何“变得更快”,这是我认为人们在思考很多的概念。 如果您不打算通过许多并发请求访问您的Web服务,那么您很可能不会看到使用它的任何好处。 正如@Scott指出的那样,异步方法在幕后生成状态机时会有轻微的开销 。
async / await允许线程在空闲5秒时为其他请求提供服务,但最终GetMyCollectionAsync中的所有内容都必须在响应发送到客户端之前完成。
所以我希望你的代码需要5秒钟,并在响应中返回所有3个字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.