顺序WebClient请求的良好异步模式

Oma*_*ine 5 silverlight windows-phone-7

我用.NET编写的用于进行REST调用的大多数代码都是同步的.由于Windows Phone上的Silverlight仅支持Async WebClient和HttpWebRequest调用,因此我想知道对于暴露进行REST调用的方法的类,什么是良好的异步模式.

例如,我有一个需要执行以下操作的应用程序.

  1. 登录并获取令牌
  2. 使用#1中的令牌,获取相册列表
  3. 使用#1中的令牌获取类别列表
  4. 等等

我的课暴露了一些方法:

  1. 登录()
  2. GetAlbums()
  3. GetCategories()

因为每个方法都需要使用异步调用来调用WebClient,所以我需要做的就是阻止调用Login直到它返回,这样我就可以调用GetAlbums().

在我的班级中暴露这些方法的好方法是什么?

Jer*_*all 7

您可以查看Reactive(Rx)框架扩展:

http://www.leading-edge-dev.de/?p=501

http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html

[编辑:哦 - 发现了一个很好的链接:] http://rxwiki.wikidot.com/101samples

它们提供了一种"序列"事件的方法,仅在满足某些条件时起作用 - 例如,假设你有一个方法"AuthenticationResult Authenticate(string user,string pass)"

你可以这样做:

var foo = Observable.FromAsyncPattern<string, string, AuthenticationResult>
    (client.BeginAuthenticate, client.EndAuthenticate);
var bar = foo("username","password");
var result = bar.First();
Run Code Online (Sandbox Code Playgroud)

有效地将异步方法转换为同步方法.您可以将其扩展为包含"链接":

var bar = foo("username", "password")
    .Then(authresult => DoSomethingWithResult(authresult));
Run Code Online (Sandbox Code Playgroud)

整洁的东西.:)


Aur*_*nda 3

这实际上取决于您想用这些信息做什么。例如,如果您尝试显示专辑/类别等列表,对此进行建模的一种方法是

  1. 拥有一个或多个实现 INotifyPropertyChanged 接口的类,并用作视图的数据源(查看新 PhoneListApplication 中 Models 文件夹下的文件作为示例)
  2. 启动异步操作来登录并获取令牌,让异步方法的回调为您存储令牌并调用将启动异步操作以获取专辑和类别列表的函数。
  3. 获取专辑/类别列表的异步操作的回调可以更新 ObservableList(通过向其中添加项目)。我想你对专辑和类别各有一个类,每个类都有一个可观察的列表。无论如何,添加完成后,只需使用您更改的属性的名称调用 NotifyPropertyChanged,您的数据就会显示出来。

如果您想等待,直到通过网络收到返回的信息(例如,如果您想保留登录页面,直到您知道自己已成功通过身份验证),则存在一个明显的问题。在这种情况下,您只需更改异步回调中的页面即可。

显然,您还可以做一些更奇特的事情,让线程等待异步回调设置的事件。我建议不要让 UI 线程执行此操作,因为它限制了您进行超时等操作的能力,并且通常非常混乱。