0

我的问题更多地与使用异步和等待的应用程序的体系结构有关。

假设我有一个 Web 服务,它返回一个 JSON 格式的列表Books(或任何对象)。

在传统的实现中(没有asyncawait),我将使用三个不同的类:BooksParserBooksWebService(单例)和BooksManager(单例),在Page我需要书籍列表的地方,我将有两种委托方法,一种用于成功,一种用于错误。所以基本上我会调用BooksManager并且BooksManager会调用BooksWebService,响应将被异步下载,传递给BooksParserBooksParser在解析和创建之后List<Book>将调用主线程中实现的委托方法Page(成功之一或错误之一)。

我很难理解如何进行过渡和使用async/await. 可以说我保持相同的三个类。在 BooksManager 以及 BooksWebService 中,我会将最初调用的方法更改为类似的方法,然后从我的async Task<List<Books>> GetBooks(...).方法中调用此方法并等待其响应。但问题是我无法真正理解如何处理错误(例如:没有 Internet 连接,或来自 WebService 的 4xx 状态代码)。BooksManagerPage

我应该使用 try/catch 方法还是有更清洁的方法?

4

1 回答 1

1

我会说使用try/ catch

在您的“库”async代码(例如,、、、BooksWebService)中BooksParserBooksManager您应该ConfigureAwait(false)在每个await. 这指示编译器您不需要编组回 UI 线程。

在您的 UI 代码(例如Page)中,您有一些我在博客中描述的“异步初始化”选项。由于这实际上是 UI 的一部分,您可能希望使用如下所示的方法:

public class MyPage : ...
{
  private async void OnLoad(...)
  {
    // Set up the "loading" state.

    try
    {
      var books = await BooksManager.GetBooks(...);

      // Transition to the "success" state.
    }
    catch (Exception ex)
    {
      // Transition to the "error" state.
    }
  }
}

需要注意的重要一点是,对于异步应用程序,您有一个额外的“加载”状态。这看起来像什么取决于你,但你必须设计它。

于 2013-06-18T13:04:54.753 回答