传递参数可以await吗?这样做的优点和缺点是什么?
var results = MapResults(await GetDataAsync());
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 29
更新:这个问题是我 2020 年 3 月博客的主题。有关此问题的更多讨论,请参阅它。谢谢你的有趣问题!
我将在这里假设您打算将其作为参数列表的唯一成员作为函数调用。
正如其他人所指出的,两者之间没有区别
x = M(await FAsync());
Run Code Online (Sandbox Code Playgroud)
和
var f = await FAsync();
x = M(f);
Run Code Online (Sandbox Code Playgroud)
这与
var ftask = FAsync();
x = M(await ftask)
Run Code Online (Sandbox Code Playgroud)
所以你用哪种方式写并不重要,对吗?
考虑一下。
在该特定场景中,所有三个工作流程都是相同的。但是,如果我们只是稍微改变场景,这里就会存在潜在的差异。考虑:
x = M(await FAsync(), await GAsync());
Run Code Online (Sandbox Code Playgroud)
这与
var f = await FAsync();
var g = await GAsync();
x = M(f, g);
Run Code Online (Sandbox Code Playgroud)
我们对这个工作流程了解多少? GAsync 任务直到 FAsync 任务完成才开始!但看起来这里有机会同时执行两个任务,这可能会更有效地使用当前线程!工作流程可能更好地写为:
var ftask = FAsync();
var gtask = GAsync();
x = M(await ftask, await gtask);
Run Code Online (Sandbox Code Playgroud)
现在 FAsync 和 GAsync 任务都开始了,我们在两者都完成之前不会调用 M。
我的建议是仔细考虑你把你的等待放在哪里。请记住,await 旨在成为异步工作流中的一个点,在该点处工作流异步暂停,直到满足继续的前提条件。如果您可以延迟等待任务,直到它实际上成为一个先决条件,那么您也许能够勉强获得性能上的胜利。
之间没有运行时差异;
var results = MapResults(await GetDataAsync())
Run Code Online (Sandbox Code Playgroud)
和
var tmp = await GetDataAsync();
var results = MapResults(tmp)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
823 次 |
| 最近记录: |