Utiliser efficacement les opérations asynchrones en attente d'entrée de l'utilisateur
La programmation asynchrone nécessite souvent une pause de tâches de longue durée jusqu'à l'interaction de l'utilisateur, comme un clic à bouton. Cet article explore des alternatives efficaces à l'attente occupée lors de la suspension d'une méthode asynchrone comme GetResults
jusqu'à ce qu'un événement spécifique déclenche.
Éviter le sondage inefficace
L'approche traditionnelle de la vérification en continu de l'événement (interclinaison occupée) est très inefficace. Les solutions motivées d'événements offrent une approche plus élégante et performante.
en utilisant des sémaphoreslimes pour la synchronisation
La classe SemaphoreSlim
fournit une solution basée sur un sémaphore robuste. Initialisez un sémaphore avec un décompte de départ de 0 et un nombre maximal de 1. Le gestionnaire d'événements pour le bouton "Continuer" libère le sémaphore à l'aide de Release()
. Dans GetResults
, await signal.WaitAsync()
bloque l'exécution jusqu'à la libération du sémaphore.
<code class="language-csharp">private SemaphoreSlim signal = new SemaphoreSlim(0, 1); private void ButtonContinue_Click(object sender, RoutedEventArgs e) { signal.Release(); } private async Task GetResults() { await signal.WaitAsync(); // Continue processing }</code>
Tadrerant TaskCompletionsource pour la signalisation des événements
Alternativement, TaskCompletionSource<bool>
crée une tâche représentant le résultat de clic du bouton. Le gestionnaire d'événements termine cette tâche à l'aide de SetResult()
. GetResults
attend cette tâche, suspendue l'exécution jusqu'à la fin.
<code class="language-csharp">private TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>(); private void ButtonContinue_Click(object sender, RoutedEventArgs e) { tcs.SetResult(true); } private async Task GetResults() { await tcs.Task; // Continue processing }</code>
Ces méthodes axées sur les événements offrent un moyen propre et efficace de faire une pause et de reprendre les méthodes asynchrones basées sur des événements utilisateur, éliminant les frais généraux de performance de l'attention occupée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!