Forráskód Böngészése

Optimizing layout of DelaySubscription.

Bart De Smet 8 éve
szülő
commit
769038e799

+ 27 - 16
Rx.NET/Source/src/System.Reactive/Linq/Observable/DelaySubscription.cs

@@ -6,39 +6,50 @@ using System.Reactive.Concurrency;
 
 namespace System.Reactive.Linq.ObservableImpl
 {
-    internal sealed class DelaySubscription<TSource> : Producer<TSource>
+    internal abstract class DelaySubscription<TSource> : Producer<TSource>
     {
         private readonly IObservable<TSource> _source;
-        private readonly DateTimeOffset? _dueTimeA;
-        private readonly TimeSpan? _dueTimeR;
         private readonly IScheduler _scheduler;
 
-        public DelaySubscription(IObservable<TSource> source, DateTimeOffset dueTime, IScheduler scheduler)
+        public DelaySubscription(IObservable<TSource> source, IScheduler scheduler)
         {
             _source = source;
-            _dueTimeA = dueTime;
             _scheduler = scheduler;
         }
 
-        public DelaySubscription(IObservable<TSource> source, TimeSpan dueTime, IScheduler scheduler)
+        internal sealed class Relative : DelaySubscription<TSource>
         {
-            _source = source;
-            _dueTimeR = dueTime;
-            _scheduler = scheduler;
+            private readonly TimeSpan _dueTime;
+
+            public Relative(IObservable<TSource> source, TimeSpan dueTime, IScheduler scheduler)
+                : base(source, scheduler)
+            {
+                _dueTime = dueTime;
+            }
+
+            protected override IDisposable Run(IObserver<TSource> observer, IDisposable cancel, Action<IDisposable> setSink)
+            {
+                var sink = new _(observer, cancel);
+                setSink(sink);
+                return _scheduler.Schedule(sink, _dueTime, Subscribe);
+            }
         }
 
-        protected override IDisposable Run(IObserver<TSource> observer, IDisposable cancel, Action<IDisposable> setSink)
+        internal sealed class Absolute : DelaySubscription<TSource>
         {
-            var sink = new _(observer, cancel);
-            setSink(sink);
+            private readonly DateTimeOffset _dueTime;
 
-            if (_dueTimeA.HasValue)
+            public Absolute(IObservable<TSource> source, DateTimeOffset dueTime, IScheduler scheduler)
+                : base(source, scheduler)
             {
-                return _scheduler.Schedule(sink, _dueTimeA.Value, Subscribe);
+                _dueTime = dueTime;
             }
-            else
+
+            protected override IDisposable Run(IObserver<TSource> observer, IDisposable cancel, Action<IDisposable> setSink)
             {
-                return _scheduler.Schedule(sink, _dueTimeR.Value, Subscribe);
+                var sink = new _(observer, cancel);
+                setSink(sink);
+                return _scheduler.Schedule(sink, _dueTime, Subscribe);
             }
         }
 

+ 2 - 2
Rx.NET/Source/src/System.Reactive/Linq/QueryLanguage.Time.cs

@@ -140,7 +140,7 @@ namespace System.Reactive.Linq
 
         private static IObservable<TSource> DelaySubscription_<TSource>(IObservable<TSource> source, TimeSpan dueTime, IScheduler scheduler)
         {
-            return new DelaySubscription<TSource>(source, dueTime, scheduler);
+            return new DelaySubscription<TSource>.Relative(source, dueTime, scheduler);
         }
 
         public virtual IObservable<TSource> DelaySubscription<TSource>(IObservable<TSource> source, DateTimeOffset dueTime)
@@ -155,7 +155,7 @@ namespace System.Reactive.Linq
 
         private static IObservable<TSource> DelaySubscription_<TSource>(IObservable<TSource> source, DateTimeOffset dueTime, IScheduler scheduler)
         {
-            return new DelaySubscription<TSource>(source, dueTime, scheduler);
+            return new DelaySubscription<TSource>.Absolute(source, dueTime, scheduler);
         }
 
         #endregion