瀏覽代碼

Merge pull request #1626 from dotnet/DelaySelectorFix

Claire Novotny 4 年之前
父節點
當前提交
ddf3537890

+ 16 - 8
Rx.NET/Source/src/System.Reactive/Linq/Observable/Delay.cs

@@ -681,6 +681,7 @@ namespace System.Reactive.Linq.ObservableImpl
                 {
                     private readonly _ _parent;
                     private readonly TSource _value;
+                    private bool _once;
 
                     public DelayObserver(_ parent, TSource value)
                     {
@@ -690,12 +691,16 @@ namespace System.Reactive.Linq.ObservableImpl
 
                     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 @@ namespace System.Reactive.Linq.ObservableImpl
 
                     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();
+                            }
                         }
                     }
                 }

+ 12 - 0
Rx.NET/Source/tests/Tests.System.Reactive/Tests/Linq/Observable/DelayTest.cs

@@ -1405,6 +1405,18 @@ namespace ReactiveTests.Tests
             );
         }
 
+        [Fact]
+        public void Delay_Duration_Selector_Immediately()
+        {
+            var list = new List<int>();
+
+            Observable.Range(1, 5)
+                .Delay(_ => Observable.Return(1))
+                .Subscribe(list.Add);
+
+            Assert.Equal(new List<int>() { 1, 2, 3, 4, 5 }, list);
+        }
+
         [Fact]
         public void Delay_Duration_InnerDone()
         {