繁体   English   中英

你必须等待异步方法吗?

[英]Do you have to await async methods?

假设您有一个服务API调用。 被调用者在某种程度上对性能至关重要,因此为了不长时间地阻止API调用,需要使用SaveAsync()方法。 但是,我不能await它,因为这会阻止API调用与非异步版本一样长(或者甚至更长)。

我问的原因是:如果你没有 await调用,返回的Task对象是否有可能被垃圾回收? 如果是这样,会中断正在运行的任务吗?

我问的原因是:如果你没有等待调用,返回的Task对象是否有可能被垃圾回收?

一般来说,不,这不应该发生。 对任务进行排队的底层TaskScheduler通常会在完成之前保持对其所需生命周期的引用。 您可以在TaskScheduler.QueueTask的文档中看到:

典型的实现将任务存储在内部数据结构中,该内部数据结构将由将在未来某个时间执行这些任务的线程提供服务。

您真正的问题将出现在ASP.NET SynchronizationContext上,它会在运行时跟踪任何正在进行的异步操作。 如果您的控制器操作在异步操作之前完成,那么您将获得异常。

如果您想在ASP.NET中进行“即发即忘”操作,则应确保通过HostingEnvironment.QueueBackgroundWorkItemBackgroundTaskManager将它们注册到ASP.NET运行时。

不,它不会中断正在运行的任务,但你也不会从任务中看到异常,这不是很好。 您可以(至少部分地)通过将所有正在运行的代码包装在try ... catch并避免记录异常来避免这种情况。

此外,如果您在asp.net中,那么您的整个应用程序可能会被停止或回收,在这种情况下,您的任务将被中断。 这很难避免 - 您可以注册AppPool关机通知,或使用像Hangfire这样的东西

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM