Browse Source

Reduce allocations when creating weak event subscribers.

pull/7372/head
Dariusz Komosiński 5 years ago
parent
commit
276afe4271
  1. 21
      src/Avalonia.Base/Utilities/IWeakEventSubscriber.cs
  2. 12
      src/Avalonia.Base/Visual.cs

21
src/Avalonia.Base/Utilities/IWeakEventSubscriber.cs

@ -11,7 +11,7 @@ public interface IWeakEventSubscriber<in TEventArgs> where TEventArgs : EventArg
void OnEvent(object? sender, WeakEvent ev, TEventArgs e); void OnEvent(object? sender, WeakEvent ev, TEventArgs e);
} }
public class WeakEventSubscriber<TEventArgs> : IWeakEventSubscriber<TEventArgs> where TEventArgs : EventArgs public sealed class WeakEventSubscriber<TEventArgs> : IWeakEventSubscriber<TEventArgs> where TEventArgs : EventArgs
{ {
public event Action<object?, WeakEvent, TEventArgs>? Event; public event Action<object?, WeakEvent, TEventArgs>? Event;
@ -19,4 +19,21 @@ public class WeakEventSubscriber<TEventArgs> : IWeakEventSubscriber<TEventArgs>
{ {
Event?.Invoke(sender, ev, e); Event?.Invoke(sender, ev, e);
} }
} }
public sealed class TargetWeakEventSubscriber<TTarget, TEventArgs> : IWeakEventSubscriber<TEventArgs> where TEventArgs : EventArgs
{
private readonly TTarget _target;
private readonly Action<TTarget, object?, WeakEvent, TEventArgs> _dispatchFunc;
public TargetWeakEventSubscriber(TTarget target, Action<TTarget, object?, WeakEvent, TEventArgs> dispatchFunc)
{
_target = target;
_dispatchFunc = dispatchFunc;
}
void IWeakEventSubscriber<TEventArgs>.OnEvent(object? sender, WeakEvent ev, TEventArgs e)
{
_dispatchFunc(_target, sender, ev, e);
}
}

12
src/Avalonia.Base/Visual.cs

@ -108,7 +108,7 @@ namespace Avalonia
private IRenderRoot? _visualRoot; private IRenderRoot? _visualRoot;
private IVisual? _visualParent; private IVisual? _visualParent;
private bool _hasMirrorTransform; private bool _hasMirrorTransform;
private WeakEventSubscriber<EventArgs>? _affectsRenderWeakSubscriber; private TargetWeakEventSubscriber<Visual, EventArgs>? _affectsRenderWeakSubscriber;
/// <summary> /// <summary>
/// Initializes static members of the <see cref="Visual"/> class. /// Initializes static members of the <see cref="Visual"/> class.
@ -383,11 +383,11 @@ namespace Avalonia
{ {
if (sender._affectsRenderWeakSubscriber == null) if (sender._affectsRenderWeakSubscriber == null)
{ {
sender._affectsRenderWeakSubscriber = new WeakEventSubscriber<EventArgs>(); sender._affectsRenderWeakSubscriber = new TargetWeakEventSubscriber<Visual, EventArgs>(
sender._affectsRenderWeakSubscriber.Event += delegate sender, static (target, _, _, _) =>
{ {
sender.InvalidateVisual(); target.InvalidateVisual();
}; });
} }
InvalidatedWeakEvent.Subscribe(newValue, sender._affectsRenderWeakSubscriber); InvalidatedWeakEvent.Subscribe(newValue, sender._affectsRenderWeakSubscriber);
} }

Loading…
Cancel
Save