// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace CommunityToolkit.Common.Deferred; /// /// Extensions to for Deferred Events. /// public static class EventHandlerExtensions { /// /// Use to invoke an async using . /// /// type. /// to be invoked. /// Sender of the event. /// instance. /// to wait on deferred event handler. public static Task InvokeAsync(this EventHandler? eventHandler, object sender, T eventArgs) where T : DeferredEventArgs { return InvokeAsync(eventHandler, sender, eventArgs, CancellationToken.None); } /// /// Use to invoke an async using with a . /// /// type. /// to be invoked. /// Sender of the event. /// instance. /// option. /// to wait on deferred event handler. public static Task InvokeAsync(this EventHandler? eventHandler, object sender, T eventArgs, CancellationToken cancellationToken) where T : DeferredEventArgs { if (eventHandler == null) { return Task.CompletedTask; } Task[]? tasks = eventHandler.GetInvocationList() .OfType>() .Select(invocationDelegate => { cancellationToken.ThrowIfCancellationRequested(); invocationDelegate(sender, eventArgs); #pragma warning disable CS0618 // Type or member is obsolete EventDeferral? deferral = eventArgs.GetCurrentDeferralAndReset(); return deferral?.WaitForCompletion(cancellationToken) ?? Task.CompletedTask; #pragma warning restore CS0618 // Type or member is obsolete }) .ToArray(); return Task.WhenAll(tasks); } }