Maison > développement back-end > C++ > Comment annuler une tâche.Wait () après un délai d'expiration?

Comment annuler une tâche.Wait () après un délai d'expiration?

Patricia Arquette
Libérer: 2025-01-27 22:21:09
original
186 Les gens l'ont consulté

How to Cancel a Task.Wait() After a Timeout?

Gérez les délais d'attente des tâches asynchrones avec élégance : annulez Task.Wait() dans les 5 secondes

La méthode GetFinalUrl de ce code instancie par programme un navigateur Web, accède à une URL et renvoie l'URL finale une fois le chargement du document terminé. Afin d'arrêter la tâche lorsque le document se charge pendant plus de 5 secondes et que GetFinalUrl() renvoie null, vous pouvez utiliser la méthode de tâche timeout. Voici le code modifié :

<code class="language-csharp">private Uri GetFinalUrl(PortalMerchant portalMerchant)
{
    SetBrowserFeatureControl();
    Uri finalUri = null;
    if (string.IsNullOrEmpty(portalMerchant.Url))
    {
        return null;
    }
    Uri trackingUrl = new Uri(portalMerchant.Url);
    // 创建一个超时取消令牌源
    using (var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(5)))
    {
        var task = MessageLoopWorker.Run(DoWorkAsync, trackingUrl, timeoutCts.Token);
        try
        {
            // 在超时时间内等待任务完成
            task.Wait(timeoutCts.Token);
            if (!String.IsNullOrEmpty(task.Result?.ToString()))
            {
                return new Uri(task.Result.ToString());
            }
        }
        catch (OperationCanceledException)
        {
            // 任务超时,返回null
            return null;
        }
    }
    throw new Exception("解析失败");
}</code>
Copier après la connexion

Dans ce code modifié, un CancellationTokenSource(TimeSpan) (timeoutCts) avec un timeout de 5 secondes est créé à l'aide du constructeur CancellationTokenSource. Utilisez ensuite la méthode Wait(CancellationToken) pour attendre que la tâche se termine dans le délai spécifié par CancellationToken. Si la tâche n'est pas terminée dans le délai d'expiration, une exception OperationCanceledException est levée et la méthode GetFinalUrl renvoie null. Notez la vérification nulle ajoutée pour task.Result pour éviter une potentielle NullReferenceException.

De cette façon, nous évitons efficacement les blocages prolongés et gérons les situations d'expiration potentielles avec élégance.

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