当前位置: 首页 > 知识库问答 >
问题:

异步-等待-我做过头了吗?

长孙泉
2023-03-14
public async Task<IHttpActionResult> GetMessages()
{
    var result = await _messageRepository.GetMessagesAsync().ConfigureAwait(false);
    return Ok(result);
}

存储库:

public async Task<List<string>> GetMessagesAsync()    
{
    return await _referralMessageData.GetMessagesAsync().ConfigureAwait(false);
}

数据:

public async Task<List<string>> GetMessagesAsync()
{           
    return await _context.Messages.Select(i => i.Message).ToListAsync().ConfigureAwait(false);
}

共有1个答案

柳奇思
2023-03-14

如果我们能把async-await放在一个地方,让.NET处理其余部分,那就太好了,但我们不能。那么,是我做过头了还是没那么简单。

如果简单一点就好了。

示例存储库和数据代码中没有太多真正的逻辑(在await之后也没有),因此可以将它们简化为直接返回任务,正如其他评论者所指出的那样。

public async Task<IHttpActionResult> GetMessages()
{
  var result = await _messageRepository.GetMessagesAsync();
  return Ok(result);
}

每种方法都必须使用这种方法。每个使用异步/await的方法都在建立自己的回调。如果不需要回调,那么该方法可以直接返回任务,避免异步/Await。其他异步系统(例如,JavaScript中的promise)也有同样的限制:它们必须始终是异步的。

从概念上讲,可以定义一个系统,其中任何阻塞操作都将自动生成线程。我反对这样一个系统的最重要的论点是,它将具有隐含的重入性。特别是在考虑第三方库更改时,自动生成系统将是不可维护的。在签名中明确API的异步性要好得多(例如,如果它返回task,那么它就是异步的)。

现在,@usr提出了一个很好的观点,也许您根本不需要异步。例如,如果您的实体框架代码正在查询SQL Server的单个实例,那么这几乎肯定是正确的。这是因为Async在ASP.NET上的主要优点是可伸缩性,如果不需要(ASP.NET部分的)可伸缩性,那么就不需要异步。请参阅我的MSDN关于AsyncASP.NET的文章中的“不是灵丹妙药”一节。

当然,相反的论点是,对落后的开发人员的适当反应是培训他们,而不是限制可用的技术。

简言之:

  • 执行异步的正确方法是“一路”。在ASP.NET上尤其如此,而且不太可能很快改变。
  • 异步是否合适或有用,取决于您和应用程序的场景。
 类似资料:
  • 我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)

  • 问题内容: 我认为我对 .NET 的经验可能会影响我的理解,因此我想一些代码示例: 我正在尝试让快速控制器在返回响应之前等待5秒: 该代码不起作用,浏览器不断加载和加载,从不显示任何内容。 我基于此SO答案构建的函数以及控制器方法,是基于(对)其工作原理的(错误的)理解,因此我需要进行一些澄清和更正: 1.我应该什么时候使用? 据我了解,您应该在函数调用之前使用。这样对吗?另外,为什么我可以在返回

  • 我正在尝试将数据库调用移出控制器,以清理并使其可测试。当它们在控制器中时,一切都会顺利进行。我将它们移出控制器,并添加了一个异步,以确保我们等待。否则,我将调用的中的函数。现在,一旦我使用async/await,控制器中的函数就会认为没有用户,因为它没有等待。 有几个关于异步等待的SO问题,但我没有找到一个解决我的问题。我确实验证了返回了我的用户,并添加了控制台日志来显示路径。 节点猫鼬异步等待似

  • 我通读了Dart/flatter中的Async/Await/then,试图理解为什么aysnc函数中的Await不会等到完成后再继续。在我的UI中,有一个按钮调用一个异步方法来返回一个位置,该位置总是返回null,并且不等待函数完成。 该函数将调用推送到一个新的UI页面,该页面选择一个位置,并应返回一个结果。如何使该函数等待结果?我不是在使用异步吗?

  • 问题内容: 我使用Node.js和TypeScript,并且使用。这是我的测试用例: 我想为整个功能设置一个超时时间。即如果要花费2秒,花费0.5秒,花费5秒,我想在3秒钟后让我抛出错误的超时。 正常调用是一个问题,因为范围丢失了: 而且我不能用普通的方式抓住它: 有关如何解决的任何想法? 问题答案: 您可以使用超时: 您必须将其包装在诺言中才能使用。

  • 我已经阅读了许多关于异步wait的文章,我正在尝试深入了解wait异步。我的问题是,我发现等待异步方法不会创建一个新线程,它只会使UI响应。如果是这样,使用wait异步时没有时间增益,因为没有使用额外的线程。 到目前为止,我所知道的只是这项任务。Run()创建新线程。任务也是这样吗。WhenAll()或任务。WhenAny()? 假设我们有这样的代码: 我的期望: > 创建getStringTas