Maison > développement back-end > C++ > Comment suspendre une méthode asynchrone jusqu'à ce qu'un événement se produise?

Comment suspendre une méthode asynchrone jusqu'à ce qu'un événement se produise?

DDD
Libérer: 2025-01-29 16:51:11
original
253 Les gens l'ont consulté

How to Suspend an Async Method Until an Event Occurs?

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal