有没有这样写方法的场景:
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();
}
能说得通吗?
当您可以从内部的doanotherthingAsync()
调用直接返回task
时,为什么要使用return await
构造?
我在很多地方看到带有return await
的代码,我想我可能漏掉了什么。 但据我所知,在这种情况下不使用async/await关键字而直接返回任务在功能上是等价的。 为什么要增加额外的等待
层的额外开销?
您想要这样做的唯一原因是,如果前面的代码中有其他一些await
,或者如果您在返回结果之前以某种方式对结果进行操作。 发生这种情况的另一种方式是通过try/catch
更改异常的处理方式。 如果您没有做任何这些,那么您是对的,没有理由增加使方法异步
的开销。
如果不需要异步
(即可以直接返回任务
),那么就不要使用异步
。
在某些情况下,return await
非常有用,比如您有两个异步操作要执行:
var intermediate = await FirstAsync();
return await SecondAwait(intermediate);
有关异步
性能的更多信息,请参阅Stephen Toub的MSDN文章和有关该主题的视频。
更新:我写了一篇博客文章,内容更详细。
当正常方法中的return
和async
方法中的returnAwait
行为不同时,会出现一种不正常的情况:当与using
(或者更一般地,try
块中的任何returnAwait
组合使用时)。
考虑一下方法的两个版本:
Task<SomeResult> DoSomethingAsync()
{
using (var foo = new Foo())
{
return foo.DoAnotherThingAsync();
}
}
async Task<SomeResult> DoSomethingAsync()
{
using (var foo = new Foo())
{
return await foo.DoAnotherThingAsync();
}
}
第一个方法将在doanotherthingAsync()
方法返回时立即dispose()
foo
对象,这可能在它实际完成之前很久。 这意味着第一个版本可能有缺陷(因为foo
释放得太快),而第二个版本可以正常工作。
问题内容: 我正在将程序从Java转移到Objective C,需要使用在Java中经常用于线程化的wait和notify方法,但似乎在Objective C中找不到任何等效的方法。我尝试使用NSLock对象,但是我没有认为它没有用。(我正在使用[NSLock锁定]进行等待,并使用[NSLock解锁]进行通知)我无法找到的Objective C中有什么等效项吗? 问题答案: 您可以使用多种技术。您
问题内容: 当使用简单的回调(例如下面的示例)时: 如何更改功能以使用异步/等待?具体来说,假设“ someEvent”被保证只能被调用一次,那么我希望函数测试是一个异步函数,该异步函数在执行回调之前不会返回,例如: 问题答案: 不是魔术。异步函数是可以为您解开Promises的函数,因此您需要返回一个Promise才能起作用。像这样: 然后 但这也是一个谎言,因为异步函数也返回Promises本
使用以下示例中的简单回调时: 如何将函数更改为使用异步/等待?具体地说,假设某个事件保证被调用一次并且只有一次,我希望函数测试是一个异步函数,直到执行回调才返回,例如:
所以我有显式等待的问题。我不想用线。睡眠()。这是一个简单的测试,它打开一个页面,然后来回移动。加载此页面大约需要2-3秒,我希望以动态方式(测试)完成此操作。希望我不是太糊涂。我做了很多研究,但都不管用,也许我做错了什么。(我正在使用Resharper运行单元测试) 这里我还有一个解决方案: https://www.dropbox.com/s/1k5vjc5czvmdd3u/ConsoleApp
任务或任务 我们也可以定义自己的可实现对象。对象应具有以下资格。 < li >它有一个GetAwaiter()方法(实例方法或扩展方法); < li >其GetAwaiter()方法返回一个Awaiter。在下列情况下,对象是一个标识符: < ul > < li >它实现INotifyCompletion或ICriticalNotifyCompletion接口; < li >它有一个IsCompl
问题内容: 我在一个页面内有一个iframe,该页面正在不断地轮询服务器以获取正在由“主要” XHR主动更新的会话变量。 所以基本上: 主XHR运行并完成其任务,并在运行时更新会话变量。通常需要一段时间,例如超过10秒。 当主要XHR运行时,我使用并行XHR请求在服务器上轮询相同的会话变量。每当我收到来自轮询XHR的响应时,就应该更新前端视图。 问题在于,轮询XHR直到主XHR完成后才返回任何内容
我用webpack建立了一个浏览器umd库。 我正在侦听输入文件的onchange事件。当有人提交图像/文件时,它会将其转换为base64。我试图让它尽可能看起来不那么明显,所以我使用了promises和wait/asynchttps://blog.shovonhasan.com/using-promises-with-filereader/. 但是,有一个问题-当我调用convertToBase