Browse Source

Reduce calls to ToArray in PublishNext

pull/3279/head
ahopper 7 years ago
parent
commit
35ee4f7976
  1. 27
      src/Avalonia.Base/Reactive/LightweightObservableBase.cs

27
src/Avalonia.Base/Reactive/LightweightObservableBase.cs

@ -111,25 +111,38 @@ namespace Avalonia.Reactive
protected abstract void Initialize(); protected abstract void Initialize();
protected abstract void Deinitialize(); protected abstract void Deinitialize();
protected void PublishNext(T value) protected void PublishNext(T value)
{ {
if (Volatile.Read(ref _observers) != null) if (Volatile.Read(ref _observers) != null)
{ {
IObserver<T>[] observers; IObserver<T>[] observers = null;
IObserver<T> singleObserver = null;
lock (this) lock (this)
{ {
if (_observers == null) if (_observers == null)
{ {
return; return;
} }
observers = _observers.ToArray(); if (_observers.Count == 1)
{
singleObserver = _observers[0];
}
else
{
observers = _observers.ToArray();
}
} }
if (singleObserver != null)
foreach (var observer in observers)
{ {
observer.OnNext(value); singleObserver.OnNext(value);
}
else
{
foreach (var observer in observers)
{
observer.OnNext(value);
}
} }
} }
} }

Loading…
Cancel
Save