从浏览器调用异步方法

本文关键字:异步方法 调用 浏览器 | 更新日期: 2023-09-27 18:03:40

根据我对的理解,当我们使用await并且等待的任务尚未完成时,则执行返回给调用者。它在服务器端工作良好(从服务器端方法本身调用async方法)。但是当我从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在浏览器中进行了测试,比如

http://localhost测试

,但是我在UI中5秒后才得到响应。我想错了吗?

从浏览器调用异步方法

我想错了吗?

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

但是如果这是真的,那么在控制器端使用具有单个await的async方法是没有用的。对吧?因为它与同步调用

花费的时间相同
当您需要可伸缩性时,

Async会发挥作用。它不是关于"尽可能快地产生响应",而是关于能够在不耗尽线程池的情况下处理大量请求。一旦线程开始执行IO工作,它就会被返回,而不是被阻塞。因此,能够服务更多的请求。

Async本身不会让任何事情"运行得更快",这是我看到人们经常思考的一个概念。如果您不打算用许多并发请求访问您的web服务,那么您很可能不会看到使用它的任何好处。正如@Scott指出的,异步方法有一个轻微的开销,因为它在幕后生成一个状态机。

async/await允许线程在空闲5秒时离开服务其他请求,但最终GetMyCollectionAsync中的所有内容必须在响应发送到客户端之前完成。

所以我希望你的代码需要5秒,并返回响应中的所有3个字符串。