Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 每次发生另一个事件时使用“反应式”重新订阅_C# 4.0_System.reactive - Fatal编程技术网

C# 4.0 每次发生另一个事件时使用“反应式”重新订阅

C# 4.0 每次发生另一个事件时使用“反应式”重新订阅,c#-4.0,system.reactive,C# 4.0,System.reactive,我想订阅一个observable,但只运行一次操作,直到另一个IObservable触发。每次其他IObservable触发时,我都希望被重新订阅并运行我的操作一次。以下代码应实现以下功能: Action<object> act = null; act = _ => { DoThis(); obj.Observable1.SkipUntil(obj.CompletedObservable).Take(1).Subscribe(act); }; obj.Obser

我想订阅一个observable,但只运行一次操作,直到另一个IObservable触发。每次其他IObservable触发时,我都希望被重新订阅并运行我的操作一次。以下代码应实现以下功能:

Action<object> act = null;
act = _ => {
    DoThis();
    obj.Observable1.SkipUntil(obj.CompletedObservable).Take(1).Subscribe(act);
};
obj.Observable1.Take(1).Subscribe(act);
Action act=null;
act=\=>{
DoThis();
可观察的对象1.SkipUntil(完全可观察的对象)。获取(1)。订阅(act);
};
可观察的目标1.采取(1)认购(act);

在Rx框架中有没有更合适的方法来实现这一点?如果没有,我如何将此模式包装到扩展中?

您是否尝试过以下方法:

obj.CompletedObservable
    .Select(_ => obj.Observable1.Next().First())
    .Subscribe(_ => DoThis());

您是否尝试过以下方法:

obj.CompletedObservable
    .Select(_ => obj.Observable1.Next().First())
    .Subscribe(_ => DoThis());
我想我明白了:

obj
    .CompletedObservable
    .StartWith(/* value of suitable type for CompletedObservable */)
    .Select(x => obj.Observable1.Take(1))
    .Switch()
    .Subscribe(x => DoThis());
我想我明白了:

obj
    .CompletedObservable
    .StartWith(/* value of suitable type for CompletedObservable */)
    .Select(x => obj.Observable1.Take(1))
    .Switch()
    .Subscribe(x => DoThis());

似乎你想要这样的东西:

first  -----1------------2-------------3--4--------->
            |            |             |  |
second ---------A--B----------C-D-E-----------F---G->
                |             |               |
final  ---------A-------------C---------------F----- >
为此,
SelectMany
Take
TakeUntil
的组合应该可以工作。我想说:

var final = from f in first
            from s in second.Take(1).TakeUntil(first)
            select s;

.Take(1)
可确保您只获得第一项之后的第一项(对于1、2和4)。
.TakeUntil(first)
覆盖3,因此F只传递一次(到4)。如果您对该操作有一个很好的名称,那么很容易将其包装成一个将两个可观测值作为参数的方法。

您似乎希望这样:

first  -----1------------2-------------3--4--------->
            |            |             |  |
second ---------A--B----------C-D-E-----------F---G->
                |             |               |
final  ---------A-------------C---------------F----- >
为此,
SelectMany
Take
TakeUntil
的组合应该可以工作。我想说:

var final = from f in first
            from s in second.Take(1).TakeUntil(first)
            select s;

.Take(1)
可确保您只获得第一项之后的第一项(对于1、2和4)。
.TakeUntil(first)
覆盖3,因此F只传递一次(到4)。如果您对此操作有一个很好的名称,那么很容易将其包装成一个将两个可观察对象作为参数的方法。

请注意,您似乎没有使用任何一个可观察对象中的任何元素,在这种情况下,也许两个集合都可以使用.Zip ping,除非Observale1很少触发,并且您希望等待下一个。不幸的是,在完成observable激发之前必须处理observable 1。请注意,您似乎没有使用任何一个observable中的元素-在这种情况下,两个集合都可以使用.Zip ping,除非observable 1很少激发,并且您希望等待下一个。不幸的是,在完成可观测的火灾之前,必须处理可观测的1。好的解决方案。这个图表是我应该包括在内的。很好的解决方案。这张图是我应该包括在内的。StartWith使这成为一个完美的解决方案。非常感谢。StartWith提出了一个完美的解决方案。非常感谢。