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
DDDoriginal
2025-01-29 16:51:11323parcourir

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>

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!

Déclaration:
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