你必须等待异步方法吗?

Do you have to await async methods?

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

我问的原因是:如果您 await调用,返回的Task对象是否有机会得到垃圾收集?如果是这样,是否会中断 运行 任务?

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

此外,如果您在 asp.net 内,则您的整个应用程序可能会停止或回收,在 这种 情况下,您的任务将被中断。这更难避免——您可以注册 AppPool 关闭通知,或使用 Hangfire.

之类的东西

The reason I'm asking is this: If you don't await the call, is there a chance the Task object returned gets garbage collected?

一般来说,不,那不应该发生。对任务进行排队的底层 TaskScheduler 通常会在所需的生命周期内保留对它的引用,直到它完成。您可以在 TaskScheduler.QueueTask:

的文档中看到

A typical implementation would store the task in an internal data structure, which would be serviced by threads that would execute those tasks at some time in the future.

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

如果您想在 ASP.NET 中进行 "fire and forget" 操作,您应该确保通过 HostingEnvironment.QueueBackgroundWorkItem or BackgroundTaskManager[=17= 将它们注册到 ASP.NET 运行时]