Browse Source

Reduce allocations when creating weak event subscribers.

pull/7372/head
Dariusz Komosiński 4 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);
}
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;
@ -19,4 +19,21 @@ public class WeakEventSubscriber<TEventArgs> : IWeakEventSubscriber<TEventArgs>
{
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 IVisual? _visualParent;
private bool _hasMirrorTransform;
private WeakEventSubscriber<EventArgs>? _affectsRenderWeakSubscriber;
private TargetWeakEventSubscriber<Visual, EventArgs>? _affectsRenderWeakSubscriber;
/// <summary>
/// Initializes static members of the <see cref="Visual"/> class.
@ -383,11 +383,11 @@ namespace Avalonia
{
if (sender._affectsRenderWeakSubscriber == null)
{
sender._affectsRenderWeakSubscriber = new WeakEventSubscriber<EventArgs>();
sender._affectsRenderWeakSubscriber.Event += delegate
{
sender.InvalidateVisual();
};
sender._affectsRenderWeakSubscriber = new TargetWeakEventSubscriber<Visual, EventArgs>(
sender, static (target, _, _, _) =>
{
target.InvalidateVisual();
});
}
InvalidatedWeakEvent.Subscribe(newValue, sender._affectsRenderWeakSubscriber);
}

Loading…
Cancel
Save