C# 如何实现IObservable

C# 如何实现IObservable,c#,.net-core,observable,system.reactive,C#,.net Core,Observable,System.reactive,我希望能够将队列用作可观察的,但我不知道如何创建它。我希望它能够在有人调用Enqueue时推送数据 class Producer:IObservable<int> { private object @lock = new object(); private Queue<int> queue = new Queue<int>(); List<IObserver<int>> observers = new List&

我希望能够将
队列
用作
可观察的
,但我不知道如何创建它。我希望它能够在有人调用
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)
    {
    }
}
类生产者:IObservable
{
私有对象@lock=新对象();
专用队列=新队列();
列表观察员=新列表();
公共制片人()
{
}
public IObservable to obbservable()
{
返回///
}
公共布尔排队(整数示例)
{
if(sample==null)
{
返回false;
}
this.queue.Enqueue(示例);
返回true;
}
公共整数出列()
{
if(!this.queue.TryDequeue(out Sample rez))
{
返回0;
}
返回rez;
}
公共IDisposable订阅(IObserver观察员)
{
}
}

我可以用
订阅者
IObserver
来处理这个部分,我只是不知道如何将我的
生产者
对象包装在一个
IObservable
中,通常情况下,你不会自己来实现
IObservable
,而支持我。将可观测视为经典事件的备选方案,如下所示:

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);
    }
}
类生产者
{
专用队列_Queue=新队列();
私有主体_whenequeued=新主体();
public IObservable whenequeued=>\u whenequeued.AsObservable();
公共void排队(int值)
{
_queue.Enqueue(值);
_WhenQueued.OnNext(值);
}
}
这样,她的类可以在排队时订阅
,并通过将工作委托给
主题
类来获得新值的通知


如果你真的想实现
ioobservable
(通常你不会),请看一下上的示例。对不起,我忘了更改。我想知道如何将类包装在可观察对象中?为什么不使用
主题
?我对此不熟悉,这是一样的吗?请看一下对
IObservable
和一般的反应式扩展的介绍。这个页面已经过时了,但是概念仍然适用。我看到它已经被回答了。但不确定队列是否仍然有用。请在行
public IObservable whenqueued=>\u whenqueued上放置一个
.AsObservable()
。现在,您正在传递对主题的引用,任何外部代码都可以将该引用转换为主题并结束主题。