namespace ServiceLib.Events; public sealed class EventChannel { private readonly Signal _signal = new(); private readonly Lock _gate = new(); private readonly IObservable _observable; public EventChannel() { _observable = _signal.Synchronize(_gate); } public IObservable AsObservable() { return _observable; } public void Publish(T value) { lock (_gate) { _signal.OnNext(value); } } public void Publish() { if (typeof(T) != typeof(RxVoid)) { throw new InvalidOperationException("Publish() without value is only valid for EventChannel."); } lock (_gate) { _signal.OnNext((T)(object)RxVoid.Default); } } }