浏览代码

4.x: Inline disposability into ScheduledItem (#561)

David Karnok 7 年之前
父节点
当前提交
8a9a2547d0

+ 1 - 1
Rx.NET/Source/src/System.Reactive/Concurrency/CurrentThreadScheduler.cs

@@ -103,7 +103,7 @@ namespace System.Reactive.Concurrency
                 queue.Enqueue(si);
             }
 
-            return Disposable.Create(si.Cancel);
+            return si;
         }
 
         private static class Trampoline

+ 11 - 6
Rx.NET/Source/src/System.Reactive/Concurrency/ScheduledItem.cs

@@ -11,10 +11,10 @@ namespace System.Reactive.Concurrency
     /// Abstract base class for scheduled work items.
     /// </summary>
     /// <typeparam name="TAbsolute">Absolute time representation type.</typeparam>
-    public abstract class ScheduledItem<TAbsolute> : IScheduledItem<TAbsolute>, IComparable<ScheduledItem<TAbsolute>>
+    public abstract class ScheduledItem<TAbsolute> : IScheduledItem<TAbsolute>, IComparable<ScheduledItem<TAbsolute>>, IDisposable
         where TAbsolute : IComparable<TAbsolute>
     {
-        private readonly SingleAssignmentDisposable _disposable = new SingleAssignmentDisposable();
+        private IDisposable _disposable;
         private readonly IComparer<TAbsolute> _comparer;
 
         /// <summary>
@@ -42,9 +42,9 @@ namespace System.Reactive.Concurrency
         /// </summary>
         public void Invoke()
         {
-            if (!_disposable.IsDisposed)
+            if (!Disposable.GetIsDisposed(ref _disposable))
             {
-                _disposable.Disposable = InvokeCore();
+                Disposable.SetSingle(ref _disposable, InvokeCore());
             }
         }
 
@@ -149,12 +149,17 @@ namespace System.Reactive.Concurrency
         /// <summary>
         /// Cancels the work item by disposing the resource returned by <see cref="InvokeCore"/> as soon as possible.
         /// </summary>
-        public void Cancel() => _disposable.Dispose();
+        public void Cancel() => Disposable.TryDispose(ref _disposable);
 
         /// <summary>
         /// Gets whether the work item has received a cancellation request.
         /// </summary>
-        public bool IsCanceled => _disposable.IsDisposed;
+        public bool IsCanceled => Disposable.GetIsDisposed(ref _disposable);
+
+        void IDisposable.Dispose()
+        {
+            Cancel();
+        }
     }
 
     /// <summary>

+ 1 - 1
Rx.NET/Source/tests/Tests.System.Reactive.ApiApprovals/Api/ApiApprovalTests.Core.approved.txt

@@ -348,7 +348,7 @@ namespace System.Reactive.Concurrency
         public System.IDisposable SchedulePeriodic<TState>(TState state, System.TimeSpan period, System.Func<TState, TState> action) { }
         public override System.Reactive.Concurrency.IStopwatch StartStopwatch() { }
     }
-    public abstract class ScheduledItem<TAbsolute> : System.IComparable<System.Reactive.Concurrency.ScheduledItem<TAbsolute>>, System.Reactive.Concurrency.IScheduledItem<TAbsolute>
+    public abstract class ScheduledItem<TAbsolute> : System.IComparable<System.Reactive.Concurrency.ScheduledItem<TAbsolute>>, System.IDisposable, System.Reactive.Concurrency.IScheduledItem<TAbsolute>
         where TAbsolute : System.IComparable<>
     {
         protected ScheduledItem(TAbsolute dueTime, System.Collections.Generic.IComparer<TAbsolute> comparer) { }