Ist es möglich, ein Ereignis anstelle einer anderen asynchronen Methode abzuwarten?

In meiner C # / XAML-Metro-App gibt es eine Schaltfläche, mit der ein langwieriger Prozess eingeleitet wird. Daher verwende ich, wie empfohlen, async / await, um sicherzustellen, dass der UI-Thread nicht blockiert wird:

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

Gelegentlich erforderten die Vorgänge in GetResults zusätzliche Benutzereingaben, bevor sie fortgesetzt werden konnten. Nehmen wir zur Vereinfachung an, der Benutzer muss nur auf die Schaltfläche "Weiter" klicken.

Meine Frage ist:Wie kann ich die Ausführung von GetResults so anhalten, dass einVeranstaltung wie das Klicken eines anderen Knopfes?

Hier ist ein hässlicher Weg, um das zu erreichen, wonach ich suche: Die Ereignisbehandlungsroutine für die Schaltfläche "Fortfahren" setzt ein Flag ...

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

... und GetResults fragt es regelmäßig ab:

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

Das Polling ist eindeutig furchtbar (fleißiges Warten / Verschwendung von Zyklen) und ich suche etwas ereignisbasiertes.

Irgendwelche Ideen?

In diesem vereinfachten Beispiel wäre eine Lösung natürlich, GetResults () in zwei Teile aufzuteilen, den ersten Teil über die Startschaltfläche und den zweiten Teil über die Fortfahren-Schaltfläche aufzurufen. In Wirklichkeit sind die Vorgänge in GetResults komplexer, und an verschiedenen Stellen der Ausführung können unterschiedliche Benutzereingaben erforderlich sein. Eine Aufteilung der Logik in mehrere Methoden wäre daher nicht trivial.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage