title: Why is `async void` a necessary part of the C# language?
body: <p>The common description of why <code>async void</code> is part of C# is for event handlers. For example:</p>
  
  <pre><code>private async void button_Click(object sender, RoutedEventArgs e)
  {
      using (var httpClient = new HttpClient())
      {
          var response = await httpClient.GetAsync("http://example.com");
          var content = await response.Content.ReadAsStringAsync();
          this.textBox.Text = content;
      }
  }
  </code></pre>
  
  <p>I find this reason unsatisfying, as this kind of event handler can be written without <code>async void</code> like this:</p>
  
  <pre><code>private void button_Click(object sender, RoutedEventArgs e)
  {
      button_ClickAsync().ForgetTask();
  }
  
  private async Task button_ClickAsync()
  {
      using (var httpClient = new HttpClient())
      {
          var response = await httpClient.GetAsync("http://example.com");
          var content = await response.Content.ReadAsStringAsync();
          this.textBox.Text = content;
      }
  }
  
  static class TaskExtensions { public static void ForgetTask(this Task task) { } }
  </code></pre>
  
  <p>Why isn't the latter good enough? Why is <code>async void</code> a necessary part of C#? What problem can't be solved without <code>async void</code>?</p>