diff --git a/Rx.NET/Source/src/System.Reactive/Linq/Observable/Delay.cs b/Rx.NET/Source/src/System.Reactive/Linq/Observable/Delay.cs index ee7913eed5..c534791b24 100644 --- a/Rx.NET/Source/src/System.Reactive/Linq/Observable/Delay.cs +++ b/Rx.NET/Source/src/System.Reactive/Linq/Observable/Delay.cs @@ -681,6 +681,7 @@ private sealed class DelayObserver : SafeObserver { private readonly _ _parent; private readonly TSource _value; + private bool _once; public DelayObserver(_ parent, TSource value) { @@ -690,12 +691,16 @@ public DelayObserver(_ parent, TSource value) public override void OnNext(TDelay value) { - lock (_parent._gate) + if (!_once) { - _parent.ForwardOnNext(_value); + _once = true; + lock (_parent._gate) + { + _parent.ForwardOnNext(_value); - _parent._delays.Remove(this); - _parent.CheckDone(); + _parent._delays.Remove(this); + _parent.CheckDone(); + } } } @@ -709,12 +714,15 @@ public override void OnError(Exception error) public override void OnCompleted() { - lock (_parent._gate) + if (!_once) { - _parent.ForwardOnNext(_value); + lock (_parent._gate) + { + _parent.ForwardOnNext(_value); - _parent._delays.Remove(this); - _parent.CheckDone(); + _parent._delays.Remove(this); + _parent.CheckDone(); + } } } } diff --git a/Rx.NET/Source/tests/Tests.System.Reactive/Tests/Linq/Observable/DelayTest.cs b/Rx.NET/Source/tests/Tests.System.Reactive/Tests/Linq/Observable/DelayTest.cs index 5583ae58a2..0bc157cbfd 100644 --- a/Rx.NET/Source/tests/Tests.System.Reactive/Tests/Linq/Observable/DelayTest.cs +++ b/Rx.NET/Source/tests/Tests.System.Reactive/Tests/Linq/Observable/DelayTest.cs @@ -1405,6 +1405,18 @@ public void Delay_Duration_SelectorThrows2() ); } + [Fact] + public void Delay_Duration_Selector_Immediately() + { + var list = new List(); + + Observable.Range(1, 5) + .Delay(_ => Observable.Return(1)) + .Subscribe(list.Add); + + Assert.Equal(new List() { 1, 2, 3, 4, 5 }, list); + } + [Fact] public void Delay_Duration_InnerDone() {