【问题标题】:Run methods in Parallel using Reactive使用 Reactive 并行运行方法
【发布时间】:2013-03-05 20:00:06
【问题描述】:

晕,我一直在寻找 RX 框架的解决方案。我的 C# 4.0 类将调用 2 个不同的方法,为了节省时间,我想并行执行。有没有办法使用 Reactive Framework 并行运行 2 种不同的方法?不仅并行运行这两种方法,而且还应等待其他方法完成并结合两种结果。示例如下:

AccountClass ac = new AccountClass();    
string val1 = ac.Method1();  
bool val2 = ac.Method2();

我怎样才能运行这两种方法并行运行,并在订阅部分相互等待完成并将结果组合在一起?

【问题讨论】:

  • 这更像是一个TPL/Parallel 问题而不是 Rx - 这里没有真正需要“基于推送”的功能。

标签: c# .net parallel-processing system.reactive


【解决方案1】:
var result = Observable.Zip(
    Observable.Start(() => callMethodOne()),
    Observable.Start(() => callMethodTwo()),
    (one, two) => new { one, two });

result.Subscribe(x => Console.WriteLine(x));

【讨论】:

  • 这(或将Zip 替换为CombineLatest)可能是最直接的答案,尽管我仍然认为您不需要需要为此使用Rx :)
【解决方案2】:

您可以使用zip 方法来实现所需的行为。

【讨论】:

    【解决方案3】:

    类似于Rui Jarimba,但更简洁一些;

            string val1 = null;
            bool val2 = false;
    
            Action action1 = () =>
            {
                val1 = ac.Method1();
            };
    
            Action action2 = () =>
            {
                val2 = ac.Method2();
            };
    
            Parallel.Invoke(new ParallelOptions(), action1, action2);
    

    【讨论】:

      【解决方案4】:

      试试这个:

      using System.Threading.Tasks;
      
      
      string val1 = null;
      bool val2 = false;
      
      var actions = new List<Action>();
      
      actions.Add(() =>
      {
           val1 = ac.Method1();
      });
      
      actions.Add(() =>
      {
           val2 = ac.Method2();
      });
      
      
      Parallel.Invoke(new ParallelOptions(), actions.ToArray());
      
      // alternative - using Parallel.ForEach:
      // Parallel.ForEach(actions, action => action());
      
      // rest of your code here.....
      

      有用的链接:

      http://tipsandtricks.runicsoft.com/CSharp/ParallelClass.html

      【讨论】:

      • 为什么我的回答被否决了?很高兴得到谁做的评论
      猜你喜欢
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 2019-10-27
      • 2016-12-02
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多