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

C. *_*son 5 c# asynchronous async-await

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

现在问题来了:对异步方法的任何调用似乎都需要“等待”,以保证该方法实际完成并且该方法中初始化的任何状态数据可用于后续操作。但是,在调用中放置“await”要求调用方法也是异步的,然后要求该方法的调用者也使用await,依此类推,一直到调用堆栈的顶部。我发现避免这种情况的唯一方法是将对异步工厂方法的调用放在 void 异步方法中。但是,Microsoft 已明确声明该功能仅适用于事件处理程序,否则应避免使用。

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

Ste*_*ary 2

还有别的办法吗?

并不真地。函数调用要么是同步的(根据定义,阻塞线程),要么函数调用是异步的(根据定义,不阻塞线程)。一个线程不可能同时被阻塞和不被阻塞。

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

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