等待和使用丢弃之间的区别
Difference between await and using discards
下面两行有什么区别。
await SkillReporterDatabase.Database.SaveAsync(someObject);
_ = SkillReporterDatabase.Database.SaveAsync(someObject);
首选哪一个?有时当我遇到 await 的问题时,我使用 _ = 并解决了问题。我在网上看不到任何解释这两者之间区别的资源。
如果没有 await,以后的操作将不会被 SaveAsync
调用阻塞,因此会 运行 并发。丢弃只是保存任务(任务在概念上有点像进度条),而不是等待调用的方式是任务的结果。
so SaveAsync
returns a Task
(就像 JavaScript 中的承诺)。在 Task
上调用 await
将阻塞,直到任务完成并 returns 结果。不调用 await 而只是扔掉 Task 就像在 C++ 中扔掉一个指针——你的程序将启动任务然后忘记它——它可能仍然完成但是这个方法中的代码永远不会发现它是否完成了与否。
区别 是丢弃 (_
) 不关心 SaveAsync
中发生的事情,一旦它变成异步,它大概 做做;这有两个重要的副作用:
- 保存失败不知道
- 如果您通过
Database
执行任何其他操作,您 可能 将 运行 在单个 context/connection 上进行重叠操作,这通常不是受支持的场景
所以在这种情况下,await
可能是首选。有 次可以放弃任务,但这通常意味着当您在后台启动某些与 没有进一步互动当前流量。
下面两行有什么区别。
await SkillReporterDatabase.Database.SaveAsync(someObject);
_ = SkillReporterDatabase.Database.SaveAsync(someObject);
首选哪一个?有时当我遇到 await 的问题时,我使用 _ = 并解决了问题。我在网上看不到任何解释这两者之间区别的资源。
如果没有 await,以后的操作将不会被 SaveAsync
调用阻塞,因此会 运行 并发。丢弃只是保存任务(任务在概念上有点像进度条),而不是等待调用的方式是任务的结果。
so SaveAsync
returns a Task
(就像 JavaScript 中的承诺)。在 Task
上调用 await
将阻塞,直到任务完成并 returns 结果。不调用 await 而只是扔掉 Task 就像在 C++ 中扔掉一个指针——你的程序将启动任务然后忘记它——它可能仍然完成但是这个方法中的代码永远不会发现它是否完成了与否。
区别 是丢弃 (_
) 不关心 SaveAsync
中发生的事情,一旦它变成异步,它大概 做做;这有两个重要的副作用:
- 保存失败不知道
- 如果您通过
Database
执行任何其他操作,您 可能 将 运行 在单个 context/connection 上进行重叠操作,这通常不是受支持的场景
所以在这种情况下,await
可能是首选。有 次可以放弃任务,但这通常意味着当您在后台启动某些与 没有进一步互动当前流量。