通过Rx可以观察到任何反击吗?

时间:2014-07-03 13:06:35

标签: system.reactive reactive-programming

我正在寻找我会称之为CounterObservable的东西。一方会计算其上的数字,而另一方则是每次总数改变时都会收到通知的观察方。

换句话说,我会有类似的东西

public CounterObservable totalMailsReceived = new CounterObservable(0);

public void OnNewMail(Mail mail) 
{
   totalMailsReceived++;
   ///Rest of the code goes here
}

在观察者方面我将有

mailManager.totalMailsReceived.Subscribe(count => labelCount.Text = count.ToString());

或者,如果我想要真正优雅,我会使用Paul Betts' ReactiveUI如下所示

mailManager.totalMailsReceived.ToProperty(x => x.TotalMailsReceived);

到目前为止,我在Rx中找不到任何可以帮助我的东西。但我想如果我创建自己的类来实现IObservable<int>。我正在考虑利用Sample MSDN Code for IObservable implementation

我的问题是 1.那MSDN Sample线程安全吗? Rx中真的没有什么可以做我想做的事吗?

1 个答案:

答案 0 :(得分:4)

只需使用BehaviorSubject

public class MailServer
{
    private BehaviorSubject<int> _count = new BehaviorSubject<int>(0);

    public IObservable<int> TotalMailsReceived
    {
        get { return _count; }
    }

    public void OnNewMail(Mail mail)
    {
        _count.OnNext(_count.Value + 1);
    }
}

或者,如果您决定深入了解Rx,那么您只是观察Mail流,那么您可以使用对此有用的Scan运算符和Publish记住最新的价值并将其多播到所有订户。

您可以编写这种新的扩展方法:

public IObservable<T> RunningTotal<T>(this IObservable<T> source)
{
    return source.Scan(0, sum => sum + 1);
}

并像这样使用它:

public class MailServer
{
    private IConnectableObservable<int> _total;
    private IDisposable _subscription;

    public MailServer(IObservable<Mail> incomingMail)
    {
        _total = incomingMail.RunningTotal().Publish(0);
        _subscription = _total.Connect();
    }

    public IObservable<int> TotalMailsReceived
    {
        get { return _total; }
    }
}