'Action vs EventHandler vs Func for async/awaited method calls

I have async/awaited methods in my Connected anonymous method implementation and I wonder which one of these is the best to use in my case. I put examples below and added information according to what I know. Are my statements correct? Anything else important that I'm missing?

EventHandler

The only disadvantage to me is that the anonymous method is basically async void. Yes, we can have async calls, but they will be kinda "fire and forget/crash".

public class Test
{
    public event EventHandler<ConnectEventArgs>? Connected;

    public ValueTask StartAsync()
    {
        Connected?.Invoke(this, new ConnectEventArgs(...))
    }
}

var test = new Test();

test.Connected += async (sender, e) => // private async void OnConnect(object? sender, ConnectEventArgs e) => BAD
{
    await SendAsync(); // fire and forget
};

await test.StartAsync();

Func

What I notice is that we can have async calls without having to worry about async void. I think that's the only good way to have async/awaited method calls. Isn't it?

public class Test
{
    public event Func<Task>? Connected;

    public ValueTask StartAsync()
    {
        await (Connected?.Invoke() ?? Task.CompletedTask).ConfigureAwait(false);
    }
}

var test = new Test();

test.Connected += async () => // private async Task OnConnect()
{
    await SendAsync(); // Should be okay?
};

await test.StartAsync();

Action

The only difference between Action and EventHandler that comes into my mind is that we don't pass the sender and we don't have to create EventArgs classes.

public class Test
{
    public event Action<bool>? Connected;

    public ValueTask StartAsync()
    {
        Connected?.Invoke(true);
    }
}

var test = new Test();

test.Connected += async (boolean) => // private void OnConnect(bool boolean)
{
    await SendAsync(); // fire and forget
};

await test.StartAsync();


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source