title: Should I avoid 'async void' event handlers?
body: <p>I know it is considered generally a bad idea to use fire-and-forget <code>async void</code> methods to start tasks, because there is no track of the pending task and it is tricky to handle exceptions which might be thrown inside such a method.</p>
  
  <p><em>Should I generally avoid <code>async void</code> event handlers, as well?</em> For example, </p>
  
  <pre><code>private async void Form_Load(object sender, System.EventArgs e)
  {
          await Task.Delay(2000); // do async work
          // ...
  } 
  </code></pre>
  
  <p>I can rewrite it like this:</p>
  
  <pre><code>Task onFormLoadTask = null; // track the task, can implement cancellation
  
  private void Form_Load(object sender, System.EventArgs e)
  {
          this.onFormLoadTask = OnFormLoadTaskAsync(sender, e);
  } 
  
  private async Task OnFormLoadTaskAsync(object sender, System.EventArgs e)
  {
          await Task.Delay(2000); // do async work
          // ...
  } 
  </code></pre>
  
  <p><em>What are the underwater rocks for async event handlers, besides possible re-entrancy?</em></p>