是否存在这样的编写方法:
public async Task<SomeResult> DoSomethingAsync()
{
// Some synchronous code might or might not be here... //
return await DoAnotherThingAsync();
}
而不是这个:
public Task<SomeResult> DoSomethingAsync()
{
// Some synchronous code might or might not be here... //
return DoAnotherThingAsync();
}
会有意义吗?
当您可以直接返回< code >任务时,为什么要使用< code>return await构造
我在很多地方看到带有返回wait
的代码,我想我可能错过了一些东西。但据我了解,在这种情况下不使用async/wait关键字并直接返回任务在功能上是等效的。为什么要增加额外的wait
层的额外开销?
您想这样做的唯一原因是如果在早期代码中还有其他wait
,或者您在返回结果之前以某种方式操作结果。可能发生这种情况的另一种方式是通过改变异常处理方式的try/catch
。如果您没有做任何这些,那么您是对的,没有理由增加使方法async
的开销。
如果您不需要异步
(即,您可以直接返回任务
),则不要使用异步
。
在某些情况下,return-await
非常有用,例如,如果您有两个异步操作要执行:
var intermediate = await FirstAsync();
return await SecondAwait(intermediate);
有关异步
性能的更多信息,请参阅Stephen Toub关于该主题的MSDN文章和视频。
更新:我已经写了一篇博文,内容更加详细。
当在普通方法中返回
和async
方法中返回wait时,有一种偷偷摸摸的情况:当与使用的组合时(或者,更一般地,
try
块中的任何返回wait
)。
考虑方法的这两个版本:
Task<SomeResult> DoSomethingAsync()
{
using (var foo = new Foo())
{
return foo.DoAnotherThingAsync();
}
}
async Task<SomeResult> DoSomethingAsync()
{
using (var foo = new Foo())
{
return await foo.DoAnotherThingAsync();
}
}
只要< code > DoAnotherThingAsync()
方法返回,第一个方法就会< code>Dispose()该< code>Foo对象,这很可能在它实际完成之前很久。这意味着第一个版本可能有问题(因为< code>Foo被处理得太快了),而第二个版本会工作得很好。
问题内容: 我想创建一个函数来检查user_id是否已在我的数据库中。 但是,是第三方Firebase提供的API。它定义为return 。 (void)observeSingleEventOfType:(FEventType)eventType withBlock:(void(^)(FDataSnapshot * snapshot))块 错误: 感谢任何帮助。 更新 我正在尝试另一种方式: 不知
我用webpack建立了一个浏览器umd库。 我正在侦听输入文件的onchange事件。当有人提交图像/文件时,它会将其转换为base64。我试图让它尽可能看起来不那么明显,所以我使用了promises和wait/asynchttps://blog.shovonhasan.com/using-promises-with-filereader/. 但是,有一个问题-当我调用convertToBase
我有一个windows服务,我从另一个开发人员继承,它运行非常慢,并有许多对eBay API的缓慢调用。我希望在没有太多重构的情况下加快它。 我刚刚开始研究使用C#Async/Await来尝试让这些缓慢的调用运行异步。以下是我试图实现的目标: 如何获取返回的类型以便使用它们?我尝试使用,但它只有属性可用。
问题内容: 据我所知,使用或实例化对象分别返回或的新实例。具有 新标识 的新实例对象。 在我实际测试它之前,这对我来说是很清楚的,我注意到它实际上返回了而不是预期的: 如预期的那样,分别使用和创建对象时,也会表现出这种行为: 我可以在状态文档中找到唯一相关的信息: […]例如,return和return 。 如果未提供任何参数,则构造函数将创建一个新的空元组。 可以说,这不足以回答我的问题。 那么
我已经阅读并测试了所有这些答案(这个,这个和这个),但没有帮助(这也不是我第一次在这种情况下使用嘲笑,但这种情况对我来说很少见)。 我使用和进行单元测试。在测试时,我模拟了和并将它们传递给了它,一切正常,但没有返回空值,这是我的代码: 页反恐精英: PageViewModel: ViewModelTest.cs:
问题内容: 为什么要退货我可以ping通IP。 问题答案: 在很多情况下,方法对我来说并不值得使用。你可以滚动到底部以查看我的替代方法,该方法可以简单地测试你是否在线并且能够解析外部主机(例如google.com)…这似乎通常可以在机器上使用。 问题 关于此有很多chat不休: 这是其他类似的问题: 使用Java检测互联网连接 如何使用Java测试互联网的可用性? 甚至在同一件事上有报告的错误: