你必须等待异步方法吗?

Ale*_*lex 6 .net c# asynchronous task-parallel-library async-await

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

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

Yuv*_*kov 6

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

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

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

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

如果您希望在ASP.NET中执行"即发即弃"操作,则应确保通过HostingEnvironment.QueueBackgroundWorkItem 或通过ASP.NET运行时注册它们BackgroundTaskManager