你必须等待异步方法吗?

时间:2015-09-25 15:01:19

标签: c# .net asynchronous async-await task-parallel-library

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

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

2 个答案:

答案 0 :(得分:6)

  

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

一般来说,不,那不应该发生。对任务进行排队的基础TaskScheduler通常会在完成之前保留对其所需生命周期的引用。您可以在TaskScheduler.QueueTask

的文档中看到这一点
  

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

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

如果你想要发射并忘记"在ASP.NET中的操作,您应该确保通过HostingEnvironment.QueueBackgroundWorkItem BackgroundTaskManager

向ASP.NET运行时注册它们

答案 1 :(得分:2)

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

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