소스 검색

Merge pull request #797 from danielcweber/AvoidSingleAssignmentDisposableInWorkItem

Avoid allocation of a SingleAssignmentDisposable in LocalScheduler.WorkItem.
Daniel C. Weber 7 년 전
부모
커밋
e53a503bcc
1개의 변경된 파일4개의 추가작업 그리고 5개의 파일을 삭제
  1. 4 5
      Rx.NET/Source/src/System.Reactive/Concurrency/LocalScheduler.TimerQueue.cs

+ 4 - 5
Rx.NET/Source/src/System.Reactive/Concurrency/LocalScheduler.TimerQueue.cs

@@ -422,7 +422,7 @@ namespace System.Reactive.Concurrency
             public readonly LocalScheduler Scheduler;
             public readonly DateTimeOffset DueTime;
 
-            private readonly SingleAssignmentDisposable _disposable;
+            private IDisposable _disposable;
             private int _hasRun;
 
             protected WorkItem(LocalScheduler scheduler, DateTimeOffset dueTime)
@@ -430,7 +430,6 @@ namespace System.Reactive.Concurrency
                 Scheduler = scheduler;
                 DueTime = dueTime;
 
-                _disposable = new SingleAssignmentDisposable();
                 _hasRun = 0;
             }
 
@@ -446,9 +445,9 @@ namespace System.Reactive.Concurrency
                 {
                     try
                     {
-                        if (!_disposable.IsDisposed)
+                        if (!Disposable.GetIsDisposed(ref _disposable))
                         {
-                            _disposable.Disposable = InvokeCore(scheduler);
+                            Disposable.SetSingle(ref _disposable, InvokeCore(scheduler));
                         }
                     }
                     finally
@@ -462,7 +461,7 @@ namespace System.Reactive.Concurrency
 
             public int CompareTo(WorkItem/*!*/ other) => Comparer<DateTimeOffset>.Default.Compare(DueTime, other.DueTime);
 
-            public void Dispose() => _disposable.Dispose();
+            public void Dispose() => Disposable.TryDispose(ref _disposable);
         }
 
         /// <summary>