【发布时间】:2015-08-17 13:00:35
【问题描述】:
我有一个课程 Foo 有一个发布 FooState 枚举的事件。我想把这个事件变成一个 observable,为新订阅者重放最后一个值。
即使没有订阅者,任何新订阅者都应该获得最后一个值。
public enum FooState
{
Stopped = 0,
Starting = 1,
Running = 2,
}
public delegate void FooEventHandler(object sender, FooEventArgs e);
public class FooEventArgs : EventArgs
{
public FooEventArgs(FooState fooState)
{
this.State = fooState;
}
public FooState State {get; private set;}
}
public class Foo
{
public event FooEventHandler FooEvent;
public void OnFooEvent(FooState state)
{
var fooEvent = FooEvent;
if(fooEvent != null)
{
fooEvent(this, new FooEventArgs(state));
}
}
}
到目前为止,我的尝试围绕着使用 Publish、RefCount 和 Replay。但是,如果我在触发事件后订阅 observable,我尝试的任何组合都不起作用。
Replay(1).RefCount() 只要至少有一个订阅就可以工作,但我还需要为第一个延迟订阅工作。
var foo = new Foo();
var obs = Observable.FromEventPattern<FooEventHandler, FooEventArgs>(
h => foo.FooEvent += h,
h => foo.FooEvent -= h)
.DistinctUntilChanged()
.Replay(1)
.RefCount();
// Works if this line is uncomented.
//obs.Subscribe(x => Console.WriteLine("Early Subscriber = " + x.EventArgs.State));
foo.OnFooEvent(FooState.Running);
obs.Subscribe(x => Console.WriteLine("Late Subscriber = " + x.EventArgs.State));
有人知道如何用 Rx 做到这一点吗?
【问题讨论】:
标签: c# system.reactive