如何避免在Rx管道中重新运行操作

时间:2015-04-23 17:15:57

标签: c# .net system.reactive reactive-programming

我有一个Rx管道,其中一些实体是根据传入的数据创建的,然后这些实体应该被保留,当它们完成时,应该打印一个状态。

我尝试过以下代码。问题是它多次重新执行操作,而不是只重复一次,因此我在数据库中获得了多个实体副本。基本上下面的代码我想打印"坚持test1"只有一次。

        var test1Observable = Observable.Return("test1");
        var test2Observable = Observable.Return("test2");

        var createTest1Observable = test1Observable.Select(name => name);
        var test1 = createTest1Observable.Do(x => Console.WriteLine("persisting test1"));

        var createTest3Observable = Observable.CombineLatest<string, string, Tuple<string,string>>(test1, test2Observable, (t1, t2) => new Tuple<string,string>(t1,t2));
        var persistTest3Observable = createTest3Observable.Do(x => Console.WriteLine("persisting test 3"));

        var createTest4Observable = test1.Select(x => "test4");
        var persistTest4Observable = createTest4Observable.Do(x => Console.WriteLine("persisting test 4"));

        var createTest5Observable = test1.Select(x => "test5");
        var persistTest5Observable = createTest5Observable.Do(x => Console.WriteLine("persisting test5"));

        var OnSuccesObservable = Observable.CombineLatest<string, Tuple<string,string>, string, string, bool>(test1, persistTest3Observable, persistTest4Observable, persistTest5Observable, (t1, t2, t3, t4) =>
        {
            if (t1 == null || t2 == null || t3 == null || t4 == null)
                return false;
            else
                return true;
        });

        OnSuccesObservable.Subscribe(
           o =>
           {
               Console.WriteLine("Finished");
               Console.ReadLine();
           });

1 个答案:

答案 0 :(得分:0)

尝试将test1设为可连接的可观察

var test1 = createTest1Observable.Do(x => Console.WriteLine("persisting test1")).Publish();

然后在所有其他代码连接到它之后如下

var connected = test1.Connect();

这可确保正确共享observable,而不是重新订阅