网上演练
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

52 lines
1.3 KiB

// Needed for NET40
#if !NET_4_6
using System;
using LinqInternal.Collections.ThreadSafe;
using LinqInternal.Threading;
using LinqInternal.Threading.Needles;
namespace LinqInternal.Collections
{
[Serializable]
internal sealed class ProxyObservable<T> : IObservable<T>, IObserver<T>, IProxyObservable<T>
{
private readonly SafeSet<Needle<IObserver<T>>> _observers;
public ProxyObservable()
{
_observers = new SafeSet<Needle<IObserver<T>>>();
}
public void OnCompleted()
{
foreach (var item in _observers)
{
item.Value.OnCompleted();
}
}
public void OnError(Exception error)
{
foreach (var item in _observers)
{
item.Value.OnError(error);
}
}
public void OnNext(T value)
{
foreach (var item in _observers)
{
item.Value.OnNext(value);
}
}
public IDisposable Subscribe(IObserver<T> observer)
{
var needle = new Needle<IObserver<T>>(observer);
_observers.AddNew(needle);
return Disposable.Create(() => _observers.Remove(needle));
}
}
}
#endif