在Silverlight中连续处理多个异步HTTP请求

问题描述:

由于Silverlight 4中通过WebClient或HttpWebRequest进行http访问的异步特性,当我想要串行执行多个http get/posts时,我发现自己编写的代码如下所示:在Silverlight中连续处理多个异步HTTP请求

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

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

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

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

采取看这个,一对夫妇我的博客文章: -

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

的文章是有点深,因为他们注重的是实际执行中,这个想法是不必须包含花哨的框架才能完成。您需要的唯一代码实际上就在文章中,不需要额外的dll或zip文件来下载。

但是请注意,在第2部分中,想象如果同步编码是可能的,您的代码将会是什么样子。在你的情况你的代码应该是这样的: -

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

下一步是修改的“做”方法的内容,以返回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 
}); 

我遇到了这个问题。我发现协程很有帮助,我将我的想法建立在Jeremy Likness和Rob Eisenberg的工作上。

这个link将提供更多的细节。

  1. 包封物每个请求到一个类
  2. 创建请求
  3. 迭代通过收集制造和处理每个请求的集合或阵列。