首页 > 解决方案 > 什么时候使用 await async 不好?

问题描述

我有一个使用 C# 编写的基于 ASP.NET Core 3.1 的项目。我知道使用的最佳时间awaitasync访问外部资源,例如从数据库中提取数据、访问文件或发出 HTTP 请求。这释放了线程,因此可以完成更多工作,而不是让线程坐在那里等待代码完成。

但是,我想弄清楚在什么时候使用async/await会损害性能?调用时释放线程await并在任务完成时检索线程的过程是否有成本?

接下来找到的代码被异步调用。实际上,不需要异步调用该代码,因为所有代码都在内存中执行,并且没有发出外部请求。

public interface ILocator
{
    Task<Model> ExampleAsync();
}

public class Example : Controller
{
    public ILocator Locator { get; set; }

    public Example(ILocator locator)
    {
        Locator = locator;
    }

    public async Task<IActionResult> Example()
    {
        Model model = await Locator.ExampleAsync();

        return View(model);
    }
}

public class Locator : ILocator
{
    pubilc Task ExampleAsync()
    {
        Example model = new Example();
        model.Status = "New";

        return Task.CompletedTask;
    }
}

这是上面代码的同步版本

public interface ILocator
{
    Model Example();
}

public class Example : Controller
{
    public ILocator Locator { get; set; }

    public Example(ILocator locator)
    {
        Locator = locator;
    }

    public IActionResult Example()
    {
        Model model = Locator.Example();

        return View(model);
    }
}

public class Locator : ILocator
{
    pubilc Example()
    {
        Example model = new Example();
        model.Status = "New";
    }
}

代码的异步版本是否会因为不必要的await/async使用而比同步版本具有更高的成本/更低的性能?

什么时候async/await弊大于利?

标签: c#.netasynchronouspromiseasync-await

解决方案


您通常async/await在执行 I/O 绑定任务时使用,例如从流中读取、从 DB 中读取、通过网络发送内容或等待响应。

这使得线程可用于执行其他一些(与 CPU 相关的工作)。

从技术上讲,async/await 在原始性能方面较慢,但是,它增加了应用程序的可伸缩性,因为它允许线程可用于其他工作,而其他线程正在等待 I/O 绑定操作。


推荐阅读