From ae695510af515a373bc010cf46aa188736b2b8de Mon Sep 17 00:00:00 2001 From: Sergio Pedri Date: Sat, 13 Jan 2024 12:22:27 +0100 Subject: [PATCH] Skip unnecessary lookup in EventRegistrationTokenTable (#1440) --- src/cswinrt/strings/WinRT.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/cswinrt/strings/WinRT.cs b/src/cswinrt/strings/WinRT.cs index 9fbb3dd4f..542a0050c 100644 --- a/src/cswinrt/strings/WinRT.cs +++ b/src/cswinrt/strings/WinRT.cs @@ -1066,11 +1066,21 @@ private EventRegistrationToken AddEventHandlerNoLock(T handler) // Get a registration token, making sure that we haven't already used the value. This should be quite // rare, but in the case it does happen, just keep trying until we find one that's unused. EventRegistrationToken token = GetPreferredToken(handler); + +#if NET6_0_OR_GREATER + // When on .NET 6+, just iterate on TryAdd, which allows skipping the extra + // lookup on the last iteration (as the handler is added rigth away instead). + while (!m_tokens.TryAdd(token, handler)) + { + token = new EventRegistrationToken { Value = token.Value + 1 }; + } +#else while (m_tokens.ContainsKey(token)) { token = new EventRegistrationToken { Value = token.Value + 1 }; } m_tokens[token] = handler; +#endif return token; }