В моем приложении метро С#/XAML есть кнопка, которая запускает длительный процесс. Поэтому, как рекомендовано, я использую async/await, чтобы убедиться, что поток пользовательского интерфейса не заблокирован:
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)
...
}
Иногда, материал, происходящий в GetResults, требует дополнительного ввода пользователя, прежде чем он сможет продолжить. Для простоты предположим, что пользователю просто нужно нажать кнопку "продолжить".
Мой вопрос: как я могу приостановить выполнение GetResults таким образом, чтобы он ожидал события, такого как щелчок другой кнопки?
Здесь уродливый способ добиться того, что я ищу: кнопка "Обработчик события для продолжения" устанавливает флаг...
private bool _continue = false;
private void buttonContinue_Click(object sender, RoutedEventArgs e)
{
_continue = true;
}
... и GetResults периодически опрашивает его:
buttonContinue.Visibility = Visibility.Visible;
while (!_continue) await Task.Delay(100); // poll _continue every 100ms
buttonContinue.Visibility = Visibility.Collapsed;
Опрос явно ужасен (ожидание/трата циклов), и я ищу что-то на основе событий.
Любые идеи?
В этом упрощенном примере одним из решений было бы разделить GetResults() на две части, вызвать первую часть с кнопки запуска, а вторую часть - с кнопки продолжения. В действительности, материал, происходящий в GetResults, более сложный, и в разных точках исполнения могут потребоваться различные типы пользовательских ввода. Поэтому разбиение логики на несколько методов было бы нетривиальным.