É possível aguardar um evento em vez de outro método assíncrono?

No meu aplicativo metro C # / XAML, há um botão que inicia um processo de longa duração. Então, como recomendado, estou usando async / await para garantir que o thread da UI não seja bloqueado:

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, as coisas que acontecem no GetResults exigiriam entrada adicional do usuário antes que ele pudesse continuar. Por simplicidade, digamos que o usuário tenha que clicar em um botão "continuar".

Minha pergunta é:Como posso suspender a execução de GetResults de tal forma que aguarda umevento como o clique de outro botão?

Aqui está uma maneira feia de conseguir o que eu estou procurando: o manipulador de eventos para o botão continue "define um sinalizador ...

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

... e o GetResults periodicamente pesquisa:

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

A pesquisa é claramente terrível (espera ocupada / perda de ciclos) e estou procurando por algo baseado em eventos.

Alguma ideia?

Btw neste exemplo simplificado, uma solução seria, naturalmente, dividir GetResults () em duas partes, invocar a primeira parte do botão de arranque e a segunda parte do botão continuar. Na realidade, as coisas que acontecem no GetResults são mais complexas e diferentes tipos de entrada do usuário podem ser necessários em diferentes pontos da execução. Então, dividir a lógica em vários métodos seria não-trivial.

questionAnswers(7)

yourAnswerToTheQuestion