Czy można oczekiwać zdarzenia zamiast innej metody asynchronicznej?

W mojej aplikacji metra C # / XAML jest przycisk, który uruchamia długotrwały proces. Tak więc, zgodnie z zaleceniami, używam async / czekam, aby upewnić się, że wątek interfejsu użytkownika nie zostanie zablokowany:

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)
  ...
}

Czasami rzeczy zachodzące w GetResults wymagałyby dodatkowych danych użytkownika, aby można było kontynuować. Dla uproszczenia załóżmy, że użytkownik musi kliknąć przycisk „kontynuuj”.

Moje pytanie brzmi:jak mogę zawiesić wykonanie GetResults w taki sposób, że czeka nazdarzenie takie jak kliknięcie innego przycisku?

Oto brzydki sposób na osiągnięcie tego, czego szukam: program obsługi zdarzeń dla przycisku kontynuuj ustawia flagę ...

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

... a GetResults okresowo to bada:

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

Sondaż jest wyraźnie okropny (zajęty czekaniem / marnotrawstwem cykli) i szukam czegoś opartego na wydarzeniach.

Jakieś pomysły?

W tym uproszczonym przykładzie jednym rozwiązaniem byłoby oczywiście podzielenie GetResults () na dwie części, wywołanie pierwszej części z przycisku startu i drugiej części z przycisku kontynuacji. W rzeczywistości rzeczy dziejące się w GetResults są bardziej złożone, a różne typy danych wejściowych użytkownika mogą być wymagane w różnych punktach wykonania. Zatem podział logiki na wiele metod byłby nietrywialny.

questionAnswers(7)

yourAnswerToTheQuestion