Pārlūkot izejas kodu

An allocation in BasicProducer.SubscribeRaw can be saved in most cases. (#602)

Daniel C. Weber 7 gadi atpakaļ
vecāks
revīzija
a8385a8557
1 mainītis faili ar 12 papildinājumiem un 8 dzēšanām
  1. 12 8
      Rx.NET/Source/src/System.Reactive/Internal/Producer.cs

+ 12 - 8
Rx.NET/Source/src/System.Reactive/Internal/Producer.cs

@@ -38,7 +38,8 @@ namespace System.Reactive
 
         public IDisposable SubscribeRaw(IObserver<TSource> observer, bool enableSafeguard)
         {
-            var subscription = new SingleAssignmentDisposable();
+            IDisposable run;
+            ISafeObserver<TSource> safeObserver = null;
 
             //
             // See AutoDetachObserver.cs for more information on the safeguarding requirement and
@@ -46,23 +47,26 @@ namespace System.Reactive
             //
             if (enableSafeguard)
             {
-                var safeObserver = SafeObserver<TSource>.Wrap(observer);
-                safeObserver.SetResource(subscription);
-                observer = safeObserver;
+                observer = safeObserver = SafeObserver<TSource>.Wrap(observer);
             }
 
             if (CurrentThreadScheduler.IsScheduleRequired)
             {
+                var runAssignable = new SingleAssignmentDisposable();
+                
                 CurrentThreadScheduler.Instance.ScheduleAction(
-                    (@this: this, subscription, observer),
-                    tuple => tuple.subscription.Disposable = [email protected](tuple.observer));
+                    (@this: this, runAssignable, observer),
+                    tuple => tuple.runAssignable.Disposable = [email protected](tuple.observer));
+
+                run = runAssignable;
             }
             else
             {
-                subscription.Disposable = Run(observer);
+                run = Run(observer);
             }
 
-            return subscription;
+            safeObserver?.SetResource(run);
+            return run;
         }
 
         /// <summary>