【问题标题】:How to implement an IObservable如何实现 IObservable
【发布时间】:2018-12-29 17:49:52
【问题描述】:

我希望能够将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

【问题讨论】:

  • 对不起,我忘了更改。我想知道如何将类包装在 observable 中?
  • 为什么不直接使用Subject&lt;int&gt;
  • 这个我不熟悉,是一样的吗?
  • 查看introtorx.com 了解IObservable&lt;T&gt; 和反应式扩展的一般介绍。该页面已过时,但概念仍然适用。
  • 我看到它已经被回答了。不确定 Queue 是否仍然有用。

标签: c# .net-core observable system.reactive


【解决方案1】:

通常您不会自己实现IObservable&lt;T&gt; 来支持Reactive Extensions。将 observables 视为经典事件的替代品,如下所示:

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&lt;T&gt;(通常您不会),请查看IObservable documentation 中的示例

【讨论】:

  • 请在public IObservable&lt;int&gt; WhenEnqueued =&gt; _whenEnqueued; 线上输入.AsObservable()。现在,您正在传递对主题的引用,任何外部代码都可以将其转换为并结束您的主题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
相关资源
最近更新 更多