Как реализовать IObservable - PullRequest
0 голосов
/ 29 декабря 2018

Я хочу иметь возможность использовать 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)
    {
    }
}

Я могу обработать деталь с помощью Subscriber и IObserver Я просто не знаю, как обернуть мою Producer объект в IObservable

1 Ответ

0 голосов
/ 30 декабря 2018

Обычно вы не реализуете 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 документации

...