我希望能够将Queue用作Observable,但我不知道如何创建它。我希望它能够在有人呼叫Enqueue时推送数据。

class Producer:IObservable<int>
{
    private object @lock = new object();
    private Queue<int> queue = new Queue<int>();
    List<IObserver<int>> observers = new List<IObserver<int>>();

    public Producer()
    {
    }
    public IObservable<int> ToObservable()
    {
        return ///
    }
    public bool Enqueue(int sample)
    {
        if (sample == null)
        {
            return false;
        }
        this.queue.Enqueue(sample);
        return true;
    }
    public int Dequeue()
    {
        if(!this.queue.TryDequeue(out Sample rez))
        {
            return 0;
        }
        return rez;
    }

    public IDisposable Subscribe(IObserver<int> observer)
    {
    }
}


我可以用SubscriberIObserver处理零件,我只是不知道如何将Producer对象包装在IObservable

最佳答案

通常,您不会自己支持Reactive Extensions来实现IObservable<T>。可以将可观察对象视为经典事件的替代方法,如下所示:

class Producer
{
    private Queue<int> _queue = new Queue<int>();
    private Subject<int> _whenEnqueued = new Subject<int>();

    public IObservable<int> WhenEnqueued => _whenEnqueued.AsObservable();

    public void Enqueue(int value)
    {
        _queue.Enqueue(value);
        _whenEnqueued.OnNext(value);
    }
}


这样,外部类可以通过将工作委派给WhenEnqueued类来订阅Subject并获得新值的通知。

如果您真的想实现IObservable<T>(通常不这样做),请查看IObservable documentation上的示例

关于c# - 如何实现IObservable,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53971972/

10-13 00:24