Dans mon C#/XAML application de métro, il y a un bouton qui lance un long processus en cours d'exécution. Donc, comme l'a recommandé, je suis en utilisant async/await assurez-vous que le thread d'INTERFACE utilisateur n'est pas bloqué:
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)
...
}
Parfois, les choses qui se sont produites au sein de GetResults demanderait de l'entrée de l'utilisateur avant de pouvoir continuer. Pour simplifier, disons que l'utilisateur a juste à cliquer sur un bouton "continuer".
Ma question est: comment puis-je suspendre l'exécution de GetResults de telle manière qu'elle attend un événement tel que le fait de cliquer sur un autre bouton?
Voici une vilaine façon de réaliser ce que je suis à la recherche d': le gestionnaire d'événement pour la continuer" définit un indicateur...
private bool _continue = false;
private void buttonContinue_Click(object sender, RoutedEventArgs e)
{
_continue = true;
}
... et GetResults périodiquement des sondages:
buttonContinue.Visibility = Visibility.Visible;
while (!_continue) await Task.Delay(100); // poll _continue every 100ms
buttonContinue.Visibility = Visibility.Collapsed;
Le bureau de vote est clairement terrible (occupé attente / déchets de cycles) et je suis à la recherche de quelque chose basé sur des événements.
Des idées?
Btw dans cet exemple simplifié, une solution serait bien sûr de diviser GetResults() en deux parties, il faut appeler la première partie à partir du bouton démarrer et la deuxième partie à partir du bouton "continuer". En réalité, les choses qui se sont produites dans GetResults est plus complexe et les différents types de saisie de l'utilisateur peut être nécessaire à des moments différents de l'exécution. Afin de briser la logique dans plusieurs méthodes pourraient être non négligeable.