等待结束的异步方法

本文关键字:异步方法 结束 等待 | 更新日期: 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 线程(取决于实际调用它的内容(。