Should I avoid 'async void' event handlers?

Should I generally avoid async void event handlers, as well?

Generally event handlers are the one case where a void async method is not a potential code smell.

Now, if you do need to track the task for some reason then the technique you describe is perfectly reasonable.


The guideline is to avoid async void except when used in an event handler, so using async void in an event handler is OK.

That said, for unit testing reasons I often like to factor out the logic of all async void methods. E.g.,

public async Task OnFormLoadAsync(object sender, EventArgs e)
{
  await Task.Delay(2000);
  ...
}

private async void Form_Load(object sender, EventArgs e)
{
  await OnFormLoadAsync(sender, e);
}