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.