await和using discards的区别

4
下面两行代码有什么区别?
await SkillReporterDatabase.Database.SaveAsync(someObject);

_ = SkillReporterDatabase.Database.SaveAsync(someObject);

哪个更好?有时候当我面对await的问题时,我会使用_ =来解决问题。我找不到任何在线资源来解释这两者之间的区别。


1
是的。丢弃SaveAsync(一种Task)的返回值并不会确保SaveAsync运行完成,这与不等待它相同。 - MindSwipe
2
你没有等待第二个调用。 - Pavel Anikhouski
1
我认为你的第二行根本没有解决任何问题...它甚至没有被执行。它只会返回一个未运行的任务,然后被丢弃。 - Legacy Code
2
@LegacyCode "它甚至没有执行。它只会返回一个未运行的任务" - 这不正确。你应该试试。SaveAsync()将正常运行,只是你无法知道它何时或是否完成。通常称为“fire and forget”。 - Gabriel Luci
2个回答

13
< p > 这里的区别在于,弃用(_)不关心一旦SaveAsync异步化后发生了什么,而它可能会这样做; 这有两个重要的副作用:

  1. 你将无法知道保存是否失败
  2. 如果你通过Database执行任何其他操作,你可能会在一个单一的上下文/连接上运行重叠的操作,这通常不是受支持的场景

因此,在这种情况下,await可能更可取。 有时候可以放弃任务,但通常是指在后台启动了没有进一步交互的操作时。


2
没有使用 await,后续操作将不会被 SaveAsync 调用所阻塞,并且会同时运行。而丢弃(discard)只是保存了任务(Task,类似于 JavaScript 中的 promise),而不是像等待调用一样返回的任务结果。
因此,SaveAsync 返回一个 Task(类似于 JavaScript 中的 promise)。使用 await 来调用该 Task 将会阻塞,直到任务完成并返回结果。如果不使用 await 而是丢弃任务,就像在 C++ 中丢弃指针一样,你的程序将启动该任务,然后忘记它,它可能仍然会被执行,但是此方法中的代码永远不会知道它是否执行完毕。

4
使用“阻塞”一词并不完全正确。使用 await 将控制权交回给调用代码,并在 Task 完成后安排一个继续执行的操作。 - Johnathan Barclay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接