.Net Core异步等待-无法正常运行

时间:2018-08-26 07:03:40

标签: c# asp.net-core async-await asp.net-core-webapi

我正在测试使用异步和等待的影响,因为据我了解它可以通过不阻塞线程来运行多个调用。

我以这个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完全相同的操作。

这是我的结果:

enter image description here

如果我缺少某些东西或做错了什么,任何人都可以提供反馈吗?

更新: -因此,当我在两种设备(分别在计算机和手机上)上尝试运行时,它们似乎同时运行(无论是异步/等待还是普通的同步方法); -如果在同一台设备上,它们将按顺序运行(如上图所示)

2 个答案:

答案 0 :(得分:3)

运行代码异步的主要原因是有效利用计算资源。异步是不是的奇迹行,它将使其他一些代码运行更快。

在您的情况下,使用async-await时,您将主要有效地使用线程池中的线程。 让我们通过一个简单的解释来解决这个问题。

如果我们先看看您的同步方法。当线程到达此行var name = _contentManagement.GetName();时,它将等待直到返回名称。在GetName()的处理时间内,线程将绝对不执行任何操作。它将被锁定,等待响应。

但是异步方法;当您的线程到达此行var name = await _contentManagement.GetNameAsync();时,它将知道此方法已标记为await,然后线程可以自由返回线程池以服务其他内容,同时进行GetNameAsync处理。然后,GetNameAsync完成后,线程池中的一个线程将继续执行下一行。

通过这种方式,我们可以执行相同的逻辑,但是使用更少的资源(我们在处理外部异步调用时节省了线程时间

答案 1 :(得分:1)

async-await不会使其更快。实际上,它会使速度变慢。

真正的好处是响应能力。释放UI线程,释放处理Web请求的线程,等等。

您需要同时进行多个请求才能看到区别。