在C#中是否有一种方法可以调用异步方法而不会使调用者也异步?
参见英文答案 >
How to call asynchronous method from synchronous method in C#?????????????????????????????????????13个
为了更清楚,我引用了一个以前不是异步的工厂方法.在最近的API升级中,他们使旧方法过时并创建了一个新的异步方法.现在,我们的代码库最初来自VS2010,当时async尚不存在.我想将方法??调用更改为新版本,以便我们不会抛出弃用警告. 现在解决问题:对异步方法的任何调用似乎都需要“等待”以保证方法实际完成,并且在该方法中初始化的任何状态数据都可用于后续操作.但是,在调用中放置“await”要求调用方法也是异步的,然后要求该方法的调用者也使用await,依此类推,直到调用堆栈的顶部.我发现避免这种情况的唯一方法是在void async方法中调用异步工厂方法.但是,Microsoft已明确声明该功能仅适用于事件处理程序,否则应避免使用. 现在,我可以调整调用堆栈中的每个函数.但这不仅令人恼火,而且也是一种极端的封装违规行为.为什么顶级类必须更改其方法头只是因为某些调用27层的函数必须处理外部API更改?我怀疑我错过了一些非常明显的东西,但从它的外观来看,我有两个选择:更改所有方法标题或提交“糟糕的编程习惯”.还有另外一种方法吗?提前感谢任何输入. 解决方法
并不是的.函数调用是同步的(根据定义,阻塞线程),或者函数调用是异步的(根据定义,不阻塞线程).不可能同时阻塞线程并且不会阻塞线程. 我建议您升级代码以使用异步.这是最好的长期解决方案.或者,您可以关闭过时的警告,或者使用旧版本的库. 也就是说,我写了an article on brownfield async development,这说明了各种部分异步方法和各自的缺点(扰流板:没有完美的解决方案). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |