我正在测试使用异步和等待的影响,因为据我了解它可以通过不阻塞线程来运行多个调用。
我以这个link作为参考
以下是我在控制器上的代码:
[Route("api/email")]
public class EmailController : Controller
{
private ContentManagement _contentManagement;
public EmailController(ContentManagement contentManagement)
{
_contentManagement = contentManagement;
}
[HttpGet("async")]
public async Task<IActionResult> GetAsync()
{
DateTime cur = DateTime.Now;
var name = await _contentManagement.GetNameAsync();
return Ok($"Value : {name} \nStarted : {cur.TimeOfDay}\n Ended : {DateTime.Now.TimeOfDay}");
}
[HttpGet("normal")]
public IActionResult Get()
{
DateTime cur = DateTime.Now;
var name = _contentManagement.GetName();
return Ok($"Value : {name} \nStarted : {cur.TimeOfDay}\n Ended : {DateTime.Now.TimeOfDay}");
}
}
contentManagement类与上面的链接中提供的完全相同。
我发现当我同时调用异步Web api时,它们通过顺序执行任务来执行与同步Web api完全相同的操作。
这是我的结果:
如果我缺少某些东西或做错了什么,任何人都可以提供反馈吗?
更新: -因此,当我在两种设备(分别在计算机和手机上)上尝试运行时,它们似乎同时运行(无论是异步/等待还是普通的同步方法); -如果在同一台设备上,它们将按顺序运行(如上图所示)
答案 0 :(得分:3)
运行代码异步的主要原因是有效利用计算资源。异步是不是的奇迹行,它将使其他一些代码运行更快。
在您的情况下,使用async-await时,您将主要有效地使用线程池中的线程。 让我们通过一个简单的解释来解决这个问题。
如果我们先看看您的同步方法。当线程到达此行var name = _contentManagement.GetName();
时,它将等待直到返回名称。在GetName()的处理时间内,线程将绝对不执行任何操作。它将被锁定,等待响应。
但是异步方法;当您的线程到达此行var name = await _contentManagement.GetNameAsync();
时,它将知道此方法已标记为await
,然后线程可以自由返回线程池以服务其他内容,同时进行GetNameAsync
处理。然后,GetNameAsync
完成后,线程池中的一个线程将继续执行下一行。
通过这种方式,我们可以执行相同的逻辑,但是使用更少的资源(我们在处理外部异步调用时节省了线程时间)
答案 1 :(得分:1)
async-await
不会使其更快。实际上,它会使速度变慢。
真正的好处是响应能力。释放UI线程,释放处理Web请求的线程,等等。
您需要同时进行多个请求才能看到区别。