Avoid unnecessary DispatcherOperationCallback allocations in ElementProxy properties (#4732)

We can just pass `this` as the argument and let the compiler cache the delegate for the non-capturing lambda, rather than allocating a new delegate for the instance method on each access.
This commit is contained in:
Stephen Toub 2021-08-17 12:35:41 -04:00 коммит произвёл GitHub
Родитель 3ca050a987
Коммит e3cca0ecf3
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
1 изменённых файлов: 12 добавлений и 12 удалений

Просмотреть файл

@ -117,7 +117,7 @@ namespace MS.Internal.Automation
{ {
return ProviderOptions.ServerSideProvider; return ProviderOptions.ServerSideProvider;
} }
return (ProviderOptions)ElementUtil.Invoke(peer, new DispatcherOperationCallback( InContextGetProviderOptions ), null); return (ProviderOptions)ElementUtil.Invoke(peer, state => ((ElementProxy)state).InContextGetProviderOptions(), this);
} }
} }
@ -168,7 +168,7 @@ namespace MS.Internal.Automation
{ {
throw new ElementNotAvailableException(); throw new ElementNotAvailableException();
} }
return (int []) ElementUtil.Invoke( peer, new DispatcherOperationCallback( InContextGetRuntimeId ), null ); return (int []) ElementUtil.Invoke( peer, state => ((ElementProxy)state).InContextGetRuntimeId(), this);
} }
public Rect BoundingRectangle public Rect BoundingRectangle
@ -180,7 +180,7 @@ namespace MS.Internal.Automation
{ {
throw new ElementNotAvailableException(); throw new ElementNotAvailableException();
} }
return (Rect)ElementUtil.Invoke(peer, new DispatcherOperationCallback(InContextBoundingRectangle), null); return (Rect)ElementUtil.Invoke(peer, state => ((ElementProxy)state).InContextBoundingRectangle(), this);
} }
} }
@ -196,7 +196,7 @@ namespace MS.Internal.Automation
{ {
throw new ElementNotAvailableException(); throw new ElementNotAvailableException();
} }
ElementUtil.Invoke(peer, new DispatcherOperationCallback( InContextSetFocus ), null); ElementUtil.Invoke(peer, state => ((ElementProxy)state).InContextSetFocus(), this);
} }
public IRawElementProviderFragmentRoot FragmentRoot public IRawElementProviderFragmentRoot FragmentRoot
@ -208,7 +208,7 @@ namespace MS.Internal.Automation
{ {
return null; return null;
} }
return (IRawElementProviderFragmentRoot) ElementUtil.Invoke( peer, new DispatcherOperationCallback( InContextFragmentRoot ), null ); return (IRawElementProviderFragmentRoot) ElementUtil.Invoke( peer, state => ((ElementProxy)state).InContextFragmentRoot(), this);
} }
} }
@ -230,7 +230,7 @@ namespace MS.Internal.Automation
{ {
return null; return null;
} }
return (IRawElementProviderFragment) ElementUtil.Invoke( peer, new DispatcherOperationCallback( InContextGetFocus ), null ); return (IRawElementProviderFragment) ElementUtil.Invoke( peer, state => ((ElementProxy)state).InContextGetFocus(), this);
} }
// Event support: EventMap is a static class and access is synchronized, so no need to access it in UI thread context. // Event support: EventMap is a static class and access is synchronized, so no need to access it in UI thread context.
@ -344,7 +344,7 @@ namespace MS.Internal.Automation
} }
// Return proxy representing currently focused element (if any) // Return proxy representing currently focused element (if any)
private object InContextGetFocus( object unused ) private object InContextGetFocus()
{ {
// Note: - what if a custom element - eg anchor in a text box - has focus? // Note: - what if a custom element - eg anchor in a text box - has focus?
// won't have a UIElement there, can we even find the host? // won't have a UIElement there, can we even find the host?
@ -427,7 +427,7 @@ namespace MS.Internal.Automation
// Return value for specified property; or null if not supported // Return value for specified property; or null if not supported
private object InContextGetProviderOptions( object arg ) private object InContextGetProviderOptions()
{ {
ProviderOptions options = ProviderOptions.ServerSideProvider; ProviderOptions options = ProviderOptions.ServerSideProvider;
AutomationPeer peer = Peer; AutomationPeer peer = Peer;
@ -464,7 +464,7 @@ namespace MS.Internal.Automation
} }
// Return unique ID for this element... // Return unique ID for this element...
private object InContextGetRuntimeId( object unused ) private object InContextGetRuntimeId()
{ {
AutomationPeer peer = Peer; AutomationPeer peer = Peer;
if (peer == null) if (peer == null)
@ -475,7 +475,7 @@ namespace MS.Internal.Automation
} }
// Return bounding rectangle (screen coords) for this element... // Return bounding rectangle (screen coords) for this element...
private object InContextBoundingRectangle(object unused) private object InContextBoundingRectangle()
{ {
AutomationPeer peer = Peer; AutomationPeer peer = Peer;
if (peer == null) if (peer == null)
@ -486,7 +486,7 @@ namespace MS.Internal.Automation
} }
// Set focus to this element... // Set focus to this element...
private object InContextSetFocus( object unused ) private object InContextSetFocus()
{ {
AutomationPeer peer = Peer; AutomationPeer peer = Peer;
if (peer == null) if (peer == null)
@ -498,7 +498,7 @@ namespace MS.Internal.Automation
} }
// Return proxy representing the root of this WCP tree... // Return proxy representing the root of this WCP tree...
private object InContextFragmentRoot( object unused ) private object InContextFragmentRoot()
{ {
AutomationPeer peer = Peer; AutomationPeer peer = Peer;
AutomationPeer root = peer; AutomationPeer root = peer;