假设您有一个服务API调用。被调用者在某种程度上对性能至关重要,因此为了不超过必要的时间来阻止API调用,使用了SaveAsync()
方法。但是,我不能await
,因为这会使API调用与非异步版本一样长(或者甚至更长)。
我问的原因是:如果你不 await
这个电话,那么返回的Task
对象是否有可能被垃圾收集?如果是这样,会中断正在运行的任务吗?
答案 0 :(得分:6)
我问的原因是:如果你没有等待电话,那么返回的Task对象是否有可能被垃圾收集?
一般来说,不,那不应该发生。对任务进行排队的基础TaskScheduler
通常会在完成之前保留对其所需生命周期的引用。您可以在TaskScheduler.QueueTask
:
典型的实现会将任务存储在内部数据结构中,该结构将由将在未来某个时间执行这些任务的线程提供服务。
您的真正问题将在于ASP.NET SynchronizationContext,它会在运行时跟踪正在进行的任何异步操作。如果您的控制器操作在异步操作之前完成,那么您将获得异常。
如果你想要发射并忘记"在ASP.NET中的操作,您应该确保通过HostingEnvironment.QueueBackgroundWorkItem
或BackgroundTaskManager
答案 1 :(得分:2)
不,它不会中断正在运行的任务,但你也不会观察到任务的异常,这不是很好。您可以(至少部分地)通过将所有正在运行的代码包装在try ... catch
中并记录异常来避免这种情况。
此外,如果您在asp.net中,那么您的整个应用程序可能会被停止或回收,而在此情况下,您的任务将被中断。这很难避免 - 您可以注册AppPool关机通知,或使用类似Hangfire的内容。