No meu aplicativo de metrô C # / XAML, há um botão que inicia um processo de longa duração. Portanto, como recomendado, estou usando async / waitit para garantir que o thread da interface do usuário 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 exigem entrada adicional do usuário antes que ele possa continuar. Para simplificar, digamos que o usuário apenas tenha que clicar no botão "continuar".
Minha pergunta é: como posso suspender a execução de GetResults de forma que aguarde um evento como o clique de outro botão?
Aqui está uma maneira feia de conseguir o que estou procurando: o manipulador de eventos para o botão continuar "define um sinalizador ...
private bool _continue = false;
private void buttonContinue_Click(object sender, RoutedEventArgs e)
{
_continue = true;
}
... e o GetResults realiza pesquisas periodicamente:
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 / desperdício de ciclos) e estou procurando algo baseado em eventos.
Alguma ideia?
Entre neste exemplo simplificado, uma solução seria, obviamente, dividir GetResults () em duas partes, invocar a primeira parte do botão Iniciar 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. Portanto, dividir a lógica em vários métodos não seria trivial.
ManualResetEvent(Slim)
não parece apoiarWaitAsync()
.