在Silverlight中串行处理多个异步HTTP请求

时间:2011-02-04 22:22:22

标签: silverlight asynchronous httpwebrequest webclient

由于Silverlight 4中通过WebClient或HttpWebRequest进行http访问的异步性质,当我想连续进行多个http get / posts时,我发现自己编写的代码如下:

doFirstGet(someParams, () =>   
  {
    doSecondGet(someParams, () =>
      {
        doThirdGet(...
      }   
  });

或类似的东西。我最终会在回调中嵌套后续调用,通常使用某种lambdas实现。即使我把事情分解为动作或单独的方法,它仍然最终难以阅读。

有没有人有一个干净的解决方案来串行执行SL 4中的多个http请求?

我不需要实际将所有这些关闭同步的代码,但我需要连续发生请求,因此每个请求都需要有效同步。

3 个答案:

答案 0 :(得分:2)

请看一下我的几篇博文: -

Simple Asynchronous Operation Runner – Part 1
Simple Asynchronous Operation Runner – Part 2

这篇文章有点深入,因为它们专注于实际的实现,这个想法不一定要包括花哨的框架才能完成这项工作。你需要的唯一代码实际上是在文章中,没有额外的dll或zip文件可供下载。

然而,在第2部分中,请注意如果可以进行同步编码,则想象您的代码会是什么样子。在您的情况下,您的代码将如下所示: -

void StuffToDo()
{
    doFirstGet(someParams);
    doSecondGet(someParams);
    doThirdGet(...);
}

下一步是修改“do”方法的内容以返回AsyncOperation。目前他们可能看起来像这样: -

void doFirst(someParams, Action callback)
{
    SomeAsyncObj thing = new SomeAsyncObj();
    thing.OnCompleted += (s, args) { callback() };
    thing.DoSomethingAsync();
} 

您可以将其转换为: -

AsyncOperation doFirst(someParams)
{
    return (completed) =>
    {
        SomeAsyncObj thing = new SomeAsyncObj();
        thing.OnCompleted += (s, args) =>
        {
            try
            {
                completed(null);
            }
            catch (Exception err)
            {
                completed(err);
            }
        };
        thing.DoSomethingAsync(source);
    };
}

第三步是修改你想象中的同步代码,如下所示: -

IEnumerable<AsyncOperation> StuffToDo()
{
    yield return doFirstGet(someParams);
    // Do some other synchronous stuff here, this code won't run until doFirstGet has completed.
    yield return doSecondGet(someParams);
    // Do some other synchronous stuff here, this code won't run until doSecondGethas completed.
    yield return doThirdGet(...);
    // Do some final synchronous stuff here, this code won't run until doThirdGethas completed.

}

最后,对StuffToDo的调用更改为: -

StuffToDo().Run((err) =>
{
   // report any error in err sensibly
});

答案 1 :(得分:1)

我遇到过这个问题。我发现协同程序非常有用,我根据Jeremy Likness和Rob Eisenberg的工作提出了我的想法。

link会提供更多详情。

答案 2 :(得分:1)

  1. 将每个请求封装到一个类
  2. 创建请求的集合或数组
  3. 迭代收集制作和处理每个请求。