从浏览器调用异步方法

时间:2015-07-19 15:44:46

标签: 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";
        }
}

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

  

http://localhost:port/Test

,但我的UI中仅在5秒后得到了回复。 我在想错吗?

2 个答案:

答案 0 :(得分:7)

  

我是否错误地思考?

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

  

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

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

Async本身并没有做任何事情&#34;走得更快&#34;,这是我认为人们想的很多的概念。如果您不打算通过许多并发请求访问您的网络服务,那么您很可能不会看到使用它的任何好处。正如@Scott指出的那样,异步方法有一个轻微开销,因为它在幕后生成状态机。

答案 1 :(得分:1)

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

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

相关问题