// 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);
}
}