我正在尝试使用Rx来评估从发布/订阅模式创建序列(即经典观察者模式,其中下一个元素由生产者发布)。这基本上与.net事件相同,除了我们需要概括它以使得事件不是必需的,所以我无法利用Observable.FromEvent。我玩过Observable.Create和Observable.Generate并发现自己最终不得不编写代码来处理pub / sub(即我必须编写生产者/消费者代码来存储已发布的项目,然后通过用它来调用IObserver.OnNext()),所以看起来我并没有真正利用Rx ......
我向下看正确的路径还是适合Rx?
由于
答案 0 :(得分:2)
您的发布商只是公开了一些IObservables
作为属性。而且您的消费者只需Subscribe
给他们(或者在订阅之前做他们想要的任何Rx-fu)。
有时,这就像在发布商中使用Subjects
一样简单。有时它会更复杂,因为您的出版商实际上正在观察其他一些可观察的过程。
这是一个愚蠢的例子:
public class Publisher
{
private readonly Subject<Foo> _topic1;
/// <summary>Observe Foo values on this topic</summary>
public IObservable<Foo> FooTopic
{
get { return _topic1.AsObservable(); }
}
private readonly IObservable<long> _topic2;
/// <summary>Observe the current time whenever our clock ticks</summary>
public IObservable<DateTime> ClockTickTopic
{
get { return _topic2.Select(t => DateTime.Now); }
}
public Publisher()
{
_topic1 = new Subject<Foo>();
// tick once each second
_topic2 = Observable.Interval(TimeSpan.FromSeconds(1));
}
/// <summary>Let everyone know about the new Foo</summary>
public NewFoo(Foo foo) { _topic1.OnNext(foo); }
}
// interested code...
Publisher p = ...;
p.FooTopic.Subscribe(foo => ...);
p.ClickTickTopic.Subscribe(currentTime => ...);
// count how many foos occur during each clock tick
p.FooTopic.Buffer(p.ClockTickTopic)
.Subscribe(foos => Console.WriteLine("{0} foos during this interval", foos.Count));
答案 1 :(得分:1)
使用RX绝对适合pub / sub。这是一个演示,演示了使用IObservable
和RX。
使用NuGet为您的项目添加Reactive Extensions(RX),搜索rx-main
并安装Reactive Extensions - Main Library
。
using System;
using System.Reactive.Subjects;
namespace RX_2
{
public static class Program
{
static void Main(string[] args)
{
Subject<int> stream = new Subject<int>();
stream.Subscribe(
o =>
{
Console.Write(o);
});
stream.Subscribe(
o =>
{
Console.Write(o);
});
for (int i = 0; i < 5; i++)
{
stream.OnNext(i);
}
Console.ReadKey();
}
}
}
执行时,代码输出:
0011223344