У меня есть класс Foo
с событием, которое публикует перечисление FooState
. Я хочу превратить это событие в наблюдаемое, которое повторяет последнее значение для новых подписчиков.Опубликовать последнее значение события для новых подписчиков
Даже если подписчиков нет, любой новый абонент должен получить последнее значение.
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
. Но ни одна из комбинаций, которые я пробовала работать, если я подписываюсь на наблюдаемый после того, как я запустил это событие.
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?
Есть ли способ автоматически «Подключиться» при создании наблюдаемого? т. е. мне не нужно управлять подпиской 'Connect' отдельно? –
@NedStoyanov Как вы собираетесь определить, когда пришло время очистить ваш поток? В основном, как вы знаете, когда поток сделан? – paulpdaniels
@NedStoyanov - Вам либо нужно подключить все через вызов '.Connect()' или через '.Subscribe (...)'. Но поскольку вы хотите делиться ценностями между подписками, у вас мало выбора, кроме как использовать '.Connect()'. – Enigmativity