我正在寻找我会称之为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中真的没有什么可以做我想做的事吗?
答案 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; }
}
}