在C#中是否有一种方法可以调用异步方法而不使调用者也成为异步的?

5
更明确地说,我指的是一个以前不是异步的工厂方法。在最近的API升级中,他们使旧方法过时并创建了一个新的异步方法。现在,我们的代码库最初来自于VS2010,当时异步还不存在。我想将方法调用更改为新版本,这样我们就不会抛出弃用警告。
现在问题来了:任何对异步方法的调用似乎都需要使用"await"来保证方法实际完成,并且该方法中初始化的任何状态数据可用于后续操作。然而,在调用中放置"await"需要调用方法也是异步的,这又需要调用者使用"await",一直到调用堆栈的顶部。我发现避免这种情况的唯一方法是将对异步工厂方法的调用放在void异步方法中。然而,微软已经明确表示,该功能仅适用于事件处理程序,否则应避免使用。
现在,我可以调整调用堆栈中的每个函数。但这不仅令人恼火,而且是极端的封装违规。为什么顶层类必须更改其方法头,只因为某个对外部API更改的函数调用了27层?我怀疑我漏掉了一些非常明显的东西,但从外表看来,我有两个选择:要么改变所有的方法头,要么接受"不良编程实践"。还有其他方法吗?提前感谢您的任何意见。

这就是异步工作的原理。虽然你可以直接使用 Task,但它并没有什么帮助。 - SLaks
1
换句话说,异步远不止是一种实现细节;它是一种不同的方式来“调用”操作(或者更确切地说,获取响应)。 - SLaks
你并不孤单。 - Dbl
1个回答

2
有其他的方法吗?
实际上没有。函数调用可以是同步的(根据定义,会阻塞线程),或者是异步的(根据定义,不会阻塞线程)。不可能同时阻塞和不阻塞线程。
我建议您升级代码以使用async。这是最好的长期解决方案。或者,您可以关闭过时警告,或者使用旧版本的库。
话虽如此,我写了一篇关于棕色地带异步开发的文章,阐述了各种部分异步方法及其缺点(剧透:没有完美的解决方案)。

我理解你的意思。只是希望有一种方法可以告诉.NET:“是的,我知道它是异步的,但对于这个调用,假装它不是。” 也许直接开始将整个程序变成异步的并不是一个坏主意,就像你说的那样。 - C. Williamson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接