Metro 应用中的异步调用链接

本文关键字:调用 链接 异步 应用 Metro | 更新日期: 2023-09-27 18:31:15

我对 Metro 开发很陌生,我只希望我能够以可以理解的方式表达我的问题......

实际上,我正在将旧应用程序的一部分移植到Metro。逻辑部分是一个单独的项目(可移植库),它应该用于 1) 旧的 WPF 应用和 2) 新的 Metro 应用。基本逻辑是相同的,但某些子系统(例如文件操作管理器)必须以不同的方式编码 - 即 Metro 的异步方式。

我的问题是:我是否必须将整个方法调用者-被调用者链重写为新的异步范式?假设我有 4 个方法链,从方法 A = Metro UI 事件异步处理程序开始(对我来说,将其编码为异步无效是有意义的,因为它是顶部的 fire&forget 事件),通过接下来的 2 个方法(B 和 C)放置在我应用程序的不同层,下到包含"await CreateFileAsync"方法的方法 D(由 Microsoft 异步)。

现在:异步 CreateFileAsync 方法应该使用 await 调用。这迫使我也使方法 D 异步。要从 C 调用方法 D,从 B 调用 C,从 A 调用 B - 我是否必须将所有 A、B 和 C 重写为 async-await 样式?

能感觉到我错过了更深层次的知识,所以我试图教育自己,但同时我想在这里试试运气......

我必须重写代码的很大一部分吗?我上面的陈述有错吗?

提前非常感谢,汉斯

Metro 应用中的异步调用链接

我建议您重写便携式库以异步。它不像以前那么糟糕了;Microsoft非常努力地在async/await上工作,以使将同步代码转换为异步代码尽可能容易。我预计在不久的将来会有许多其他人做同样的事情,R# 可能会实现"异步"重写。

混合同步和异步代码时存在不明显的陷阱 - 请参阅 Stephen Toub 的最后一篇博客文章 我应该为异步方法公开同步包装器吗?出于这个原因,我认为将异步操作公开为异步 API(将同步操作公开为同步 API)会更干净。

更新:如果您确实希望同步代码调用异步代码,则可以使用我的 AsyncEx 库中的 Task.WaitAndUnwrapException 扩展方法。但是,您仍然有Stephen Toub帖子中提到的问题,即这些:

  1. 如果您的库没有在所有可能的地方使用ConfigureAwait(false),则可能会死锁。
  2. 如果遇到线程池中的最大线程数,也可能死锁。

2)不再那么常见,但(1)是一种真实的可能性。它经常被刚刚测试async的人提出,所以他们把它与同步代码混合在一起。