C#中有没有一种方法可以在不使调用方也异步的情况下调用异步方法

本文关键字:调用 异步 异步方法 情况下 有没有 方法 一种 | 更新日期: 2023-09-27 17:57:40

为了更清楚,我引用了一个以前不是异步的工厂方法。在最近的API升级中,他们淘汰了旧方法,并创建了一个新的异步方法。现在,我们的代码库最初来自VS2010,当时async还不存在。我想将方法调用更改为新版本,这样我们就不会抛出弃用警告。

现在来看问题:对异步方法的任何调用似乎都需要一个"等待",以确保该方法实际完成,并且该方法中初始化的任何状态数据都可用于后续操作。然而,在调用中放入"等待"需要调用方法也是异步的,这就要求该方法的调用方也使用等待,以此类推,直到调用堆栈的顶部。我找到的避免这种情况的唯一方法是将对异步工厂方法的调用放在一个void异步方法中。然而,微软明确表示,该功能仅适用于事件处理程序,否则应避免使用。

现在,我确实可以调整调用堆栈中的每一个函数。但这不仅令人恼火,而且是一种极端的封装违规行为。为什么顶级类必须更改其方法头,仅仅因为对27层以下函数的某些调用必须处理外部API更改?我怀疑我遗漏了一些非常明显的东西,但从外观上看,我有两个选择:要么更改所有的方法头,要么提交给"糟糕的编程实践"。还有其他方法吗?提前感谢您的任何意见。

C#中有没有一种方法可以在不使调用方也异步的情况下调用异步方法

还有别的办法吗?

不是。函数调用是同步的(根据定义,阻塞线程),或者函数调用是异步的(按照定义,不阻塞线程)。线程不可能同时被阻塞和不被阻塞。

我建议您升级代码以使用async。这是最好的长期解决方案。或者,您可以关闭过时的警告,或者使用旧版本的库。

也就是说,我确实写了一篇关于棕地异步开发的文章,其中说明了各种部分异步方法及其缺点(剧透:没有完美的解决方案)。