从浏览器调用异步方法

LMK*_*LMK 3 c# asynchronous async-await

根据我的理解,当我们使用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";
        }
}
Run Code Online (Sandbox Code Playgroud)

我用浏览器中的上述API测试过

HTTP://本地主机:端口/测试

,但是我的UI中只有5秒后才收到回复.我错误地思考了吗?

Yuv*_*kov 7

我错误地思考了吗?

是.async-await不会改变HTTP协议的性质,HTTP协议的类型是请求 - 响应.在async-awaitASP.NET控制器中使用时,使用异步方法不会产生对调用者的响应,它只会将请求线程返回给线程池.

但如果这是真的,那么在控制器端使用具有单个等待的异步方法是没有用的.对?因为它花了相同的同步调用时间

当您需要可伸缩性时,异步会闪耀.它不是"尽可能快地产生这种响应",它是关于能够处理大量请求而不会耗尽线程池.一旦线程开始执行IO工作,而不是被阻止,它将被返回.因此,能够提供更多的请求.

异步本身并没有使任何"变得更快",这是我认为人们在思考很多的概念.如果您不打算通过许多并发请求访问您的Web服务,那么您很可能不会看到使用它的任何好处.正如@Scott指出的那样,异步方法在后台生成状态机时会有轻微的开销.

  • 添加到"更快"点.Async/await实际上使每个请求变得更慢**但是提供更多并发请求的能力超过了成本. (2认同)