Maison > développement back-end > C++ > Comment annuler une opération Task.await en C# après un délai d'attente ?

Comment annuler une opération Task.await en C# après un délai d'attente ?

Linda Hamilton
Libérer: 2025-01-27 22:13:10
original
379 Les gens l'ont consulté

How to Cancel a Task.await Operation in C# After a Timeout?

Implémentation de délais d'attente pour les opérations asynchrones en C #

Gérer efficacement les opérations asynchrones nécessite souvent d'incorporer des mécanismes de délai d'expiration pour empêcher le blocage indéfini. Cet article montre comment annuler une opération Task.await en C # après une période de délai d'expiration spécifiée en utilisant CancellationTokenSource.

La classe CancellationTokenSource fournit un mécanisme pour contrôler l'annulation des tâches asynchrones. En créant un CancellationTokenSource et en passant son jeton à la tâche, vous pouvez déclencher l'annulation en cas de besoin.

Exemple de code:

L'enseignement de code C # suivant illustre l'utilisation de CancellationTokenSource pour gérer les délais d'attente:

<code class="language-csharp">private static async Task<string> GetFinalUrl(PortalMerchant portalMerchant)
{
    // ... (Existing code for setting browser features and URL validation) ...

    Uri trackingUrl = new Uri(portalMerchant.Url);
    var cts = new CancellationTokenSource();
    var task = MessageLoopWorker.Run(DoWorkAsync, trackingUrl, cts.Token);

    // Use Task.WhenAny to monitor for task completion or timeout
    if (await Task.WhenAny(task, Task.Delay(5000, cts.Token)) == task)
    {
        // Task completed within the timeout
        if (!String.IsNullOrEmpty(task.Result?.ToString()))
        {
            return new Uri(task.Result.ToString()).ToString(); // Ensure string return
        }
        else
        {
            throw new Exception("Parsing Failed");
        }
    }
    else
    {
        // Timeout occurred
        cts.Cancel(); // Explicitly cancel the task
        throw new TimeoutException();
    }
}

static async Task<object> DoWorkAsync(object[] args)
{
    // ... (Existing code for web browser interaction) ...
}</code>
Copier après la connexion

Cet extrait de code amélioré gère explicitement les valeurs nulles potentielles et garantit qu'une chaîne est renvoyée de GetFinalUrl. L'utilisation de Task.WhenAny élégamment attend la tâche DoWorkAsync à terminer ou le délai d'expiration. Si un délai d'expiration se produit, cts.Cancel() est appelé pour annuler proprement l'opération asynchrone et un TimeoutException est lancé. La gestion des erreurs est améliorée pour fournir des messages d'exception plus spécifiques. N'oubliez pas d'adapter MessageLoopWorker.Run pour gérer correctement le CancellationToken.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal