【问题标题】:Rx Framework for parallel webservice calls用于并行 Web 服务调用的 Rx 框架
【发布时间】:2013-01-18 15:18:50
【问题描述】:

我可以使用 Rx 框架同时运行多个进程而不阻塞 UI 吗? 假设我想从我的 WPF UI 同时调用不同的 web 服务 [可能是 1000 或更多]。以及每个 Web 服务调用的结果,我需要将其更新到 UI 中的网格。我使用任务和并行完成了它。但是当我开始这个过程时,Parallel foreach 只从 1000 个服务调用开始。第一次,它需要 15 或 20,之后它会调用下一个 20 或 15,等等。所以这不是我想要的。所有 1000 个调用应该同时发生,每个调用都应该处理它的结果并更新回网格!!

这种类型的操作可以使用 RX 框架吗?如果是,可以在这件事上提供任何指导方针吗?我是 RX 的新手。

非常感谢

【问题讨论】:

    标签: parallel-processing system.reactive


    【解决方案1】:

    我建议你看看 ForkJoin 方法:http://rxwiki.wikidot.com/101samples#toc3。它在 Rx 实验中。

    【讨论】:

      【解决方案2】:

      做你想做的事真的很容易。

      以下是查询结构的示例:

      var query =
          from n in Observable.Range(0, 100)
          from t in webServiceCall(n)
          select new { n, t };
      

      webServiceCall 函数具有以下签名:Func<int, IObservable<string>>

      我使用以下方法测试了上述内容:

      Func<int, IObservable<string>> webServiceCall =
          n =>
              Observable
                  .Return(n.ToString() + "!")
                  .Delay(TimeSpan.FromSeconds(1.0));
      

      ...并通过此订阅:

      query.ToArray().Subscribe(results =>
      {
          /* array of results here */
      });
      

      我在一秒钟内得到了所有结果。

      我确实使用 Observable.Range(0, 1000) 尝试过,但在 LinqPad 中出现内存不足错误,因此您可能需要注意环境中的限制。

      【讨论】:

      • 感谢您的帮助。您能否详细说明 webserviceCall 方法以便更好地理解?假设我在 WPF UI 数据网格中有 1000 条记录的集合。调用 web 服务后,每条记录都必须在 WPF UI 数据网格中更新自己的状态。
      • @Soonils - 在我的示例代码中,n 将是每条记录的索引,当您调用 Web 服务时,返回结果将是 t(无论 Web 服务返回什么类型)。 n & t 配对,即new { n, t },以便您知道哪个记录具有哪个状态。如果您不介意在结果出现时更新结果,请删除.ToArray(),您可以一次处理每一对。
      • 您好,再次感谢您的回复。我明白你在说什么。通常我们所做的是,我们从 wpf 进行 wcf 调用,而 wcf 具有回调功能。当服务执行一些冗长的过程时,它会通过回调触发每个进程状态,直到该过程完成。所以我们可以使用回调[即,来自服务的边缘事件]来更新 UI 中每个进程的状态。我们可以在不使用 Rx 在 WCF 中实现回调的情况下做同样的事情吗?哇,太好了!!!您能否对此有所了解...在您的示例中,我如何更新订阅部分中的用户界面?非常感谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      相关资源
      最近更新 更多