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

时间:2016-07-19 22:36:57

标签: c# asynchronous async-await

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

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

现在,我可以调整调用堆栈中的每个函数。但这不仅令人恼火,而且也是一种极端的封装违规行为。为什么顶级类必须更改其方法头只是因为某些调用27层的函数必须处理外部API更改?我怀疑我错过了一些非常明显的东西,但从它的外观来看,我有两个选择:更改所有方法标题或提交“糟糕的编程习惯”。还有另外一种方法吗?提前感谢任何意见。

1 个答案:

答案 0 :(得分:1)

  

还有其他办法吗?

不是真的。函数调用是同步的(根据定义,阻塞线程),或者函数调用是异步的(根据定义,不阻塞线程)。不可能同时阻塞线程并且不会阻塞线程。

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

那就是说,我写了an article on brownfield async development,它说明了各种部分异步方法以及每种方法的缺点(扰流板:没有完美的解决方案)。