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