如何在C#中链接IObservable和IObserver?

问题描述 投票:0回答:1

我从今天早上开始一直在研究Observer,但是似乎无法弄清楚如何使用内置接口来实现它。我已经看过一些示例,但是找不到任何simple示例。

到目前为止,这是我的代码,受Microsoft Documentation启发:

class ObservableClass : IObservable<bool>, IDisposable
{
    public bool observableBool;
    public List<IObserver<bool>> observers;

    public ObservableClass()
    {
        this.observableBool = false;
        this.observers = new List<IObserver<bool>>();
    }
    public IDisposable Subscribe(IObserver<bool> observer)
    {
        if (!observers.Contains(observer))
        {
            AddObserver(observer);
        }
        return this;
    }
    public void Dispose()
    {
        Console.WriteLine("Disposing...");
    }

    public void AddObserver(IObserver<bool> obs)
    {
        this.observers.Add(obs);
    }

    public void RemoveObserver(IObserver<bool> obs)
    {
        this.observers.Remove(obs);
    }

    public void SwapBool()
    {
        observableBool = !observableBool;
    }

}

可观察类包含observableBool字段。当该字段的值更改时,我想通知观察者。

这是我的观察员:

class ObserverClass : IObserver<bool>
{
    public IDisposable observable;
    public void OnCompleted()
    {
        Console.WriteLine("Completed");
    }

    public void OnError(Exception error)
    {
        Console.WriteLine("error");
    }

    public void OnNext(bool value)
    {
        Console.WriteLine("Next");
    }
    public virtual void Subscribe(IObservable<bool> obs)
    {
        if (obs != null)
            observable = obs.Subscribe(this);
    }

    public void stopObserve()
    {
        observable.Dispose();
    }
}

最后是我的程序:

static void Main(string[] args)
    {
        ObservableClass observable = new ObservableClass();
        ObserverClass observer = new ObserverClass();
        observer.Subscribe(observable);
        Console.WriteLine("subscribed observer");
        observable.SwapBool();
        Console.WriteLine("performed swapBool");
    }

预期输出:

subscribed observer
Completed //Returned by ObserverClass.OnComplete()
performed swapBool

如何进行这项工作?ObserverClass每次更改时如何调用OnComplete和observableBool的其他方法?

我知道还有其他方法可以做到这一点,但我的目标是能够使用IObserver和IObservable。

c# .net observer-pattern idisposable
1个回答
2
投票

您遍历一组可观察对象以通知它们:

public void SwapBool()
{
    observableBool = !observableBool;
    foreach (observable in observers)
    {
        observable.OnNext(observableBool);
    }
}

您应该在有新值时调用OnNextOnComplete用于通知将没有更多值。


我刚刚注意到您的观察值是IDisposable ...

首先,处置Subscribe的结果应取消该观察者的订阅。不处理可观察对象。

实际上,我希望处理可观察的对象意味着它将不再发送值(在每个人身上调用OnComplete并释放观察者列表)。

其他问题包括:

  • 您可能想要一个集合类型,以便可以更有效地添加和删除可观察对象。
  • 列表不是线程安全的。
  • 你为什么要公开你的领域?
© www.soinside.com 2019 - 2024. All rights reserved.