¿Es posible esperar un evento en lugar de otro método asíncrono?

En mi aplicación de metro C # / XAML, hay un botón que inicia un proceso de larga duración. Así que, como se recomienda, estoy usando async / await para asegurarme de que el hilo de la interfaz de usuario no se bloquee:

private async void Button_Click_1(object sender, RoutedEventArgs e) 
{
     await GetResults();
}

private async Task GetResults()
{ 
     // Do lot of complex stuff that takes a long time
     // (e.g. contact some web services)
  ...
}

Ocasionalmente, las cosas que suceden dentro de GetResults requieren una entrada adicional del usuario antes de que pueda continuar. Para simplificar, digamos que el usuario solo tiene que hacer clic en el botón "continuar".

Mi pregunta es:¿Cómo puedo suspender la ejecución de GetResults de tal manera que espera unevento ¿Como el clic de otro botón?

Esta es una manera fea de lograr lo que estoy buscando: el controlador de eventos para el botón continuar "establece una marca ...

private bool _continue = false;
private void buttonContinue_Click(object sender, RoutedEventArgs e)
{
    _continue = true;
}

... y GetResults lo encuestan periódicamente:

 buttonContinue.Visibility = Visibility.Visible;
 while (!_continue) await Task.Delay(100);  // poll _continue every 100ms
 buttonContinue.Visibility = Visibility.Collapsed;

El sondeo es claramente terrible (espera ocupada / pérdida de ciclos) y estoy buscando algo basado en eventos.

¿Algunas ideas?

Por supuesto, en este ejemplo simplificado, una solución sería, por supuesto, dividir GetResults () en dos partes, invocar la primera parte desde el botón de inicio y la segunda parte desde el botón de continuar. En realidad, las cosas que suceden en GetResults son más complejas y se pueden requerir diferentes tipos de información del usuario en diferentes puntos dentro de la ejecución. Así que dividir la lógica en múltiples métodos no sería trivial.

Respuestas a la pregunta(7)

Su respuesta a la pregunta