É 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.