¿Por qué mi código asíncrono se ejecuta de forma síncrona al depurar?

Estoy tratando de implementar un método llamadoReadAllLinesAsync utilizando la función asíncrona. He producido el siguiente código:

private static async Task<IEnumerable<string>> FileReadAllLinesAsync(string path)
{
    using (var reader = new StreamReader(path))
    {
        while ((await reader.ReadLineAsync()) != null)
        {

        }
    }
    return null;
}

private static void Main()
{
    Button buttonLoad = new Button { Text = "Load File" };
    buttonLoad.Click += async delegate
    {
        await FileReadAllLinesAsync("test.txt"); //100mb file!
        MessageBox.Show("Complete!");
    };

    Form mainForm = new Form();
    mainForm.Controls.Add(buttonLoad);
    Application.Run(mainForm);
}

Espero que el código listado se ejecute de forma asíncrona y, de hecho, lo hace. Pero solo cuando ejecuto el codigosin el depurador de Visual Studio.

Cuando corro el codigocon El Visual Studio Debugger está adjunto, el código se ejecuta de forma síncrona, bloqueando el subproceso principal causando que la interfaz de usuario se bloquee.

He intentado y logrado reproducir el problema en tres máquinas. Cada prueba se realizó en una máquina de 64 bits (ya sea Windows 8 o Windows 7) con Visual Studio 2012.

Me gustaría saber por qué ocurre este problema y cómo resolverlo (ya que ejecutar sin el depurador probablemente obstaculice el desarrollo).

Respuestas a la pregunta(4)

Su respuesta a la pregunta