Browse Source

Merge pull request #2931 from MarchingCube/routedevent-fixes

Reduce allocations when raising RoutedEvent.
pull/2816/head
Jumar Macato 7 years ago
committed by GitHub
parent
commit
5c3f852876
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 50
      src/Avalonia.Interactivity/RoutedEvent.cs

50
src/Avalonia.Interactivity/RoutedEvent.cs

@ -4,7 +4,6 @@
using System; using System;
using System.Reactive.Subjects; using System.Reactive.Subjects;
using System.Reflection; using System.Reflection;
using System.Runtime.ExceptionServices;
namespace Avalonia.Interactivity namespace Avalonia.Interactivity
{ {
@ -18,8 +17,8 @@ namespace Avalonia.Interactivity
public class RoutedEvent public class RoutedEvent
{ {
private Subject<Tuple<object, RoutedEventArgs>> _raised = new Subject<Tuple<object, RoutedEventArgs>>(); private readonly Subject<(object, RoutedEventArgs)> _raised = new Subject<(object, RoutedEventArgs)>();
private Subject<RoutedEventArgs> _routeFinished = new Subject<RoutedEventArgs>(); private readonly Subject<RoutedEventArgs> _routeFinished = new Subject<RoutedEventArgs>();
public RoutedEvent( public RoutedEvent(
string name, string name,
@ -38,31 +37,15 @@ namespace Avalonia.Interactivity
RoutingStrategies = routingStrategies; RoutingStrategies = routingStrategies;
} }
public Type EventArgsType public Type EventArgsType { get; }
{
get;
private set;
}
public string Name public string Name { get; }
{
get;
private set;
}
public Type OwnerType public Type OwnerType { get; }
{
get;
private set;
}
public RoutingStrategies RoutingStrategies public RoutingStrategies RoutingStrategies { get; }
{
get;
private set;
}
public IObservable<Tuple<object, RoutedEventArgs>> Raised => _raised; public IObservable<(object, RoutedEventArgs)> Raised => _raised;
public IObservable<RoutedEventArgs> RouteFinished => _routeFinished; public IObservable<RoutedEventArgs> RouteFinished => _routeFinished;
public static RoutedEvent<TEventArgs> Register<TOwner, TEventArgs>( public static RoutedEvent<TEventArgs> Register<TOwner, TEventArgs>(
@ -98,29 +81,20 @@ namespace Avalonia.Interactivity
{ {
return Raised.Subscribe(args => return Raised.Subscribe(args =>
{ {
var sender = args.Item1; (object sender, RoutedEventArgs e) = args;
var e = args.Item2;
if (targetType.GetTypeInfo().IsAssignableFrom(sender.GetType().GetTypeInfo()) && if (targetType.IsInstanceOfType(sender) &&
((e.Route == RoutingStrategies.Direct) || (e.Route & routes) != 0) && (e.Route == RoutingStrategies.Direct || (e.Route & routes) != 0) &&
(!e.Handled || handledEventsToo)) (!e.Handled || handledEventsToo))
{ {
try handler(sender, e);
{
handler.DynamicInvoke(sender, e);
}
catch (TargetInvocationException ex)
{
// Unwrap the inner exception.
ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
}
} }
}); });
} }
internal void InvokeRaised(object sender, RoutedEventArgs e) internal void InvokeRaised(object sender, RoutedEventArgs e)
{ {
_raised.OnNext(Tuple.Create(sender, e)); _raised.OnNext((sender, e));
} }
internal void InvokeRouteFinished(RoutedEventArgs e) internal void InvokeRouteFinished(RoutedEventArgs e)

Loading…
Cancel
Save