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

标签 silverlight asynchronous httpwebrequest webclient

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

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

或类似的东西。我最终会将后续调用嵌套在通常使用某种 lambda 实现的回调中。即使我将内容分解为 Actions 或单独的方法,它仍然难以阅读。

有没有人有一个干净的解决方案来在 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(...);
}

下一步是修改“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
});

关于silverlight - 在 Silverlight 中串行处理多个异步 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4903541/

相关文章:

silverlight - View 、模型和 View 模型之间的常见关系是什么?

c# - 如何在 Silverlight 中动态设置复选框边距

c# - Silverlight:如何从内存中卸载(处置)图像?

javascript - 如何从异步调用返回响应?

java - 将多个 ReactiveX 流合并为一个结果流

c# - 发送时发生意外错误。传输流中的 EOF 或 0 字节

php - youtube API出现403错误

asp.net - 将 Silverlight 用于整个网站?

c# - 如何在 C# 中编写防火墙自动登录应用程序

javascript - 异步回调nodejs