什么时候使用 await async 不好?

7 .net c# asynchronous promise async-await

我有一个使用 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是上面代码的同步版本

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

由于不必要的await/async使用,异步版本的代码会比同步版本的代码成本更高/性能更低吗?

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

Fre*_*els 9

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

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

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

  • 确实如此,但值得注意的是,它对于 CPU 密集型工作也很有用。当我的其他核心都在打哈欠时,我不需要 1 个核心保持 100% 使用率。 (4认同)
  • @John 这就是规划的用武之地。如果您预计需要异步,那么现在可能会接受轻微的性能影响,以便稍后可以使用。没有正确或错误的答案,你只需要考虑自己的情况。 (2认同)

Hen*_*man 4

我有一个使用 C# 编写的基于 ASP.NET Core 3.1 的项目。

这意味着 async/await 将允许您大幅增加容量(以每秒请求数为单位)。

什么时候使用 async/await 会损害性能?

它会增加一点固定金额的开销。与 I/O 成本相比,它通常很小,而且并不真正引人注目。

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

在网站/服务中,负载永远不会超过每秒 50 个请求。
即便如此,“伤害”也将非常小。

实际数字取决于硬件、I/O 工作量等。

实际上,该代码不需要异步调用,因为所有代码都在内存中执行

在这种情况下,同步处理会更快。
但我知道团队更喜欢让所有操作异步,只是为了统一。由于开销很小,我认为这也是一种有效的方法。