繁体   English   中英

我总是需要使用异步/等待吗?

[英]Do I always need to use async/await?

我想问你关于 async/await 的问题。 即,为什么总是需要使用它? (我所有的朋友都这么说)

示例 1。

public async Task Boo()
    {
        await WriteInfoIntoFile("file.txt");

        some other logic...
    }

我有一个 Boo 方法,我在其中向文件写入一些内容,然后执行一些逻辑。 这里使用了异步,这样 stream 就不会在信息写入文件的过程中停止。 一切都是合乎逻辑的。

示例 2。

public async Task Bar()
    {
        var n = await GetNAsync(nId);
        _uow.NRepository.Remove(n);
        await _uow.CompleteAsync();
    }

但是对于第二个例子,我有一个问题。 为什么在这里异步获取实体,如果没有它仍然无法进一步工作?

为什么总是需要使用它?

它不应该总是被使用。 理想情况下(尤其是对于新代码),它应该用于大多数基于 I/O 的操作。

为什么在这里异步获取实体,如果没有它仍然无法进一步工作?

异步代码就是释放调用线程。 这带来了两种好处,具体取决于代码运行的位置。

  1. 如果调用线程是 GUI 应用程序中的 UI 线程,则异步会释放 UI 线程来处理用户输入。 换句话说,应用程序的响应速度更快。
  2. 如果调用线程是服务器端线程,例如 ASP.NET 请求线程,则异步会释放该线程以处理其他用户请求。 换句话说,服务器能够进一步扩展。

根据上下文,您可能会或可能不会获得一些好处。 如果您从桌面应用程序调用第二个 function,它允许 UI 在执行异步代码时保持响应。

为什么在这里异步获取实体,如果没有它仍然无法进一步工作?

从这个 stream 的工作无法继续的意义上说,您是正确的,但是使用异步版本可以释放线程以执行其他工作:

我喜欢ASP.NET MVC 4 中 Using Asynchronous Methods 中的这段解释好处的内容:

处理异步请求

在 web 应用程序中,在启动时看到大量并发请求或具有突发负载(并发量突然增加),使 web 服务调用异步可提高应用程序的响应能力。 异步请求的处理时间与同步请求的处理时间相同。 如果请求发出需要两秒才能完成的 web 服务调用,则无论是同步执行还是异步执行,请求都需要两秒。 但是,在异步调用期间,线程在等待第一个请求完成时不会被阻止响应其他请求。 因此,当有许多并发请求调用长时间运行的操作时,异步请求可防止请求排队和线程池增长。

不确定你的意思

没有它的存在,仍然不可能进一步工作

关于示例 2。据我所知,这段代码通过 id 从其存储库中异步获取一个实体,将其删除,然后在其Unit of Work上完成事务。 你的意思是为什么它不简单地通过 id 删除条目? 这肯定是一个改进,但仍然会留下一个异步方法,因为CompleteAsync显然是异步的?

至于你的一般性问题,我不认为人们普遍认为总是使用异步/等待。

在您的第二个示例中,您使用 async/await 关键字异步获取 n 变量的值。 这可能是必要的,因为 GetNAsync 方法可能会执行一些耗时的操作,例如查询数据库,或者您可能正在下游调用 Web 服务,这可能会阻塞执行的主线程。 通过异步调用该方法,Bar方法中的代码rest可以在后台查询的同时继续运行。

但是,如果在 GetNAsync 中你只是在本地调用另一个方法来执行一些基本的 CPU 绑定任务,那么在我看来异步是毫无意义的。 当您确定需要等待时,Aync 可以很好地工作,例如网络调用或 I/O 绑定调用,这些调用肯定会增加堆栈的延迟。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM