Async Void, ASP.Net y cuenta de operaciones sobresalientes

Estoy tratando de entender por qué un método de async void en una aplicación ASP.Net puede dar como resultado la siguiente excepción, mientras que parece que la tarea async no:

System.InvalidOperationException: An asynchronous module or handler 
completed while an asynchronous operation was still pending

Soy relativamente nuevo en el mundo de async en .NET, pero siento que he intentado ejecutar este a través de una serie de recursos existentes, incluidos todos los siguientes:

¿Cuál es la diferencia entre devolver un vacío y devolver una tarea?Es todo sobre el SynchronizationContextAsync Syntactic Sugar SuggestionsAsync en ASP.NET

De estos recursos, entiendo que la mejor práctica es devolver Tarea y evitar el vacío asíncrono. También entiendo que async void incrementa el recuento de operaciones pendientes cuando se llama al método y lo disminuye cuando se completa. Esto suena como al menos parte de la respuesta a mi pregunta. Sin embargo, lo que me falta es lo que sucede cuando devuelvo la tarea y por qué hacerlo hace que las cosas "funcionen".

Aquí hay un ejemplo artificial para ilustrar mejor mi pregunta:

public class HomeController : AsyncController
{
    // This method will work fine
    public async Task<ActionResult> ThisPageWillLoad()
    {
        // Do not await the task since it is meant to be fire and forget
        var task = this.FireAndForgetTask();

        return await Task.FromResult(this.View("Index"));
    }

    private async Task FireAndForgetTask()
    {
        var task = Task.Delay(TimeSpan.FromSeconds(3));
        await task;
    }

    // This method will throw the following exception:
    // System.InvalidOperationException: An asynchronous module or 
    // handler completed while an asynchronous operation was still pending
    public async Task<ActionResult> ThisPageWillNotLoad()
    {
        // Obviously can't await a void method
        this.FireAndForgetVoid();

        return await Task.FromResult(this.View("Index"));
    }

    private async void FireAndForgetVoid()
    {
        var task = Task.Delay(TimeSpan.FromSeconds(3));
        await task;
    }
}

En una nota relacionada, si mi comprensión de async void es correcta, entonces, ¿no es un error pensar en async void como "disparar y olvidar" en este escenario, ya que ASP.Net no lo está olvidando?

Respuestas a la pregunta(1)

Su respuesta a la pregunta