等待结束的异步方法
本文关键字:异步方法 结束 等待 | 更新日期: 2023-09-27 18:34:00
我正在重写我的一些组件管理以使用异步启动方法。可悲的是,它看起来像是在没有await
的情况下调用async
方法,还在等待结果吗?
谁能开导我?
我打电话给:
public async Task StartAsync() {
await DoStartProcessingAsync();
}
这本身就是调用protected abstract Task DoStartProcessingAsync();
的缓慢实现 - 慢,因为它承载了一些 EF 调用,然后创建一个应用程序域等 - 需要"年龄"。
实际调用以以下形式完成:
x.StartAsync().Forget();
">忘记"是一个虚拟功能,只是为了避免"没有等待"警告:
public static void Forget(this Task task) {
}
可悲的是,这个序列 - 正在等待缓慢的DoStartAsync
方法完成,我认为没有理由这样做。我在 C# 中很老,但对async/await
很陌生,我的印象是,除非我等待异步任务 - 该方法将完成。因此,我希望StartAsyc().Forget()
的电话会立即回来。相反,堆栈跟踪显示线程一直进入DoStartProcessingAsync()
方法,而不会发生任何异步处理。
谁能启发我我的错误?
你在这里试图实现的是一种即发即弃类型的机制。所以async
/await
并不是你想要的。你不想await
任何东西。
这些旨在为长时间运行的进程释放线程。现在,您使用await
返回Task
,然后"忘记"它。那么为什么要归还Task
呢?
您为长时间运行的进程释放了线程,但您还排队了一个最终什么都不做的进程(这增加了您可能没有的开销(。
简单地这样做可能更有意义:
public void StartAsync() {
Task.Run(() => DoStartProcessingAsync());
}
要记住的一件事是,您现在使用的是 ThreadPool 线程而不是 UI 线程(取决于实际调用它的内容(。