c# - 在 C# 中有没有一种方法可以调用异步方法而不使调用者也异步?

标签 c# asynchronous async-await

<分区>

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

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

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

最佳答案

Is there another way?

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

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

也就是说,我确实写了an article on brownfield async development ,它说明了各种部分异步方法和每种方法的缺点(剧透:没有完美的解决方案)。

关于c# - 在 C# 中有没有一种方法可以调用异步方法而不使调用者也异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38469612/

相关文章:

postgresql - 为什么在 F# 中使用 `TransactionScope` 时 NpgsqlConnection 没有正确关闭或打开?

node.js - 具有多个 api 调用的异步/promise

c# - 更改长时间运行的等待任务的参数

c# - 如何在 aspx 页面的服务器脚本 block 中使用 [WebMethod]?

c# - c#中多重继承和接口(interface)的区别

c# - 无法上传大视频文件

javascript - window.setTimeout 用于处理异步调用同步?

ios - 在 Swift 3.0 中从异步线程调用 UIAlertController

c# - 从 Sync 方法调用 Async 方法的最佳做法是什么?

c# - 在 C# 中获取 vtable 地址?