From 53fb7a679fbd34a74da692d065ba135c56786423 Mon Sep 17 00:00:00 2001 From: "Daniel C. Weber" Date: Sat, 21 Jul 2018 11:52:44 +0200 Subject: [PATCH] Avoid allocation of a SingleAssignmentDisposable in LocalScheduler.WorkItem. --- .../Concurrency/LocalScheduler.TimerQueue.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Rx.NET/Source/src/System.Reactive/Concurrency/LocalScheduler.TimerQueue.cs b/Rx.NET/Source/src/System.Reactive/Concurrency/LocalScheduler.TimerQueue.cs index 8ecce796fa..05a74516c2 100644 --- a/Rx.NET/Source/src/System.Reactive/Concurrency/LocalScheduler.TimerQueue.cs +++ b/Rx.NET/Source/src/System.Reactive/Concurrency/LocalScheduler.TimerQueue.cs @@ -422,7 +422,7 @@ private abstract class WorkItem : IComparable, IDisposable 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 @@ protected WorkItem(LocalScheduler scheduler, DateTimeOffset dueTime) Scheduler = scheduler; DueTime = dueTime; - _disposable = new SingleAssignmentDisposable(); _hasRun = 0; } @@ -446,9 +445,9 @@ public void Invoke(IScheduler scheduler) { try { - if (!_disposable.IsDisposed) + if (!Disposable.GetIsDisposed(ref _disposable)) { - _disposable.Disposable = InvokeCore(scheduler); + Disposable.SetSingle(ref _disposable, InvokeCore(scheduler)); } } finally @@ -462,7 +461,7 @@ public void Invoke(IScheduler scheduler) public int CompareTo(WorkItem/*!*/ other) => Comparer.Default.Compare(DueTime, other.DueTime); - public void Dispose() => _disposable.Dispose(); + public void Dispose() => Disposable.TryDispose(ref _disposable); } ///