Можно ли ожидать событие вместо другого асинхронного метода?

В моем приложении C # / XAML metro естьКнопка, которая запускает длительный процесс. Так что, как и рекомендовано, яиспользуя 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, являются более сложными, и разные типы пользовательского ввода могут потребоваться в разных точках в ходе выполнения. Так что разбить логику на несколько методов было бы нетривиально.

Ответы на вопрос(7)

Ваш ответ на вопрос