我有一个异步函数,它返回一个结果。有时我需要它,有时我不需要。在下面描述的情况下,不是。这是代码:
var ignore = _applicationRepo.UpdateAsync(application);
如果你写
_applicationRepo.UpdateAsync(application);
然后IDE写一个警告warning this call is not awaited, execution of the current method continues before the call complited.
也就是说,在执行调用方法时,我的UpdateAsync? 并且一旦调用者完成,UpdateAsync它是否也可以在句子中间完成而不被执行?正确的?或者怎么理解?
最重要的问题是,我是否可以在不创建“忽略”变量的情况下忽略结果,同时确保该方法将在后台执行,即使调用者已经完成?有什么漂亮的方法可以做到这一点吗?
从 C# 7.0 开始,该语言引入了一项称为Discards的功能。
通过使用下划线,我们明确地表明结果没有被使用。并且没有为它分配内存。
不,.NET 框架不能仅仅终止任何方法,因为这至少是不安全的。只要您调用
UpdateAsync该对象Task,就会将其添加到池中,并一直保留在那里,直到完成为止。没有很好的方法可以忽略结果。您可以关闭编译器警告:
好吧,或者如果你有很多这样的调用,那么你可以在文件中写一次
#pragma warning disable 4014而不恢复它。从评论来看,您不太了解 async-await 的工作原理。它不会像您期望的那样在后台运行该方法。它只是在异步操作期间中断执行。
例如,您有以下代码
执行时会发生以下情况:
那些。执行进入一个真正无法同步完成的调用(
Task.Delay),然后才停止。完成后Task.Delay,在池中的一个线程上继续执行。如果您删除
await,则控制将OuterMethod立即跳转到其余部分,而不是暂停,其余内部方法将在池中的线程上执行:结论:
如果您确实需要在后台运行方法,请使用
Task.Run(),而不是 async-await。首先,主要问题的答案:
await _applicationRepo.UpdateAsync(application);这样可以忽略结果。在 C/C++/C# 中,函数可以返回一个值,但我们没有义务接收它。现在关于其余的:调用方法将不会完成,直到其中的运算符前面的所有功能
await都完成。调用方法将执行,但不会返回值,直到它等待 allawait。(等等)。