title: Why exactly is void async bad?
body: <p>So I understand why returning void from async would normally make no sense, but I've ran into a situation where I think it would be perfectly valid. Consider the following contrived example:</p>
  
  <pre><code>protected override void OnLoad(EventArgs e)
  {
      if (CustomTask == null)
          // Do not await anything, let OnLoad return.
          PrimeCustomTask();
  }
  private TaskCompletionSource&lt;int&gt; CustomTask;
  
  // I DO NOT care about the return value from this. So why is void bad?
  private async void PrimeCustomTask()
  {
      CustomTask = new TaskCompletionSource&lt;int&gt;();
      int result = 0;
      try
      {
          // Wait for button click to set the value, but do not block the UI.
          result = await CustomTask.Task;
      }
      catch
      {
          // Handle exceptions
      }
      CustomTask = null;
  
      // Show the value
      MessageBox.Show(result.ToString());
  }
  
  private void button1_Click(object sender, EventArgs e)
  {
      if (CustomTask != null)
          CustomTask.SetResult(500);
  }
  </code></pre>
  
  <p>I realize this is an unusual example, but I tried to make it simple and more generalized. Could someone explain to me why this is horrible code, and also how I could modify it to follow conventions correctly?</p>
  
  <p>Thanks for any help.</p>