Maison >développement back-end >C++ >Comment annuler un Task.Wait() après un délai d'attente en C# ?

Comment annuler un Task.Wait() après un délai d'attente en C# ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-27 22:16:13578parcourir

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

La méthode d'annulation de tâche.Wait () en C #

Dans ce code,

Démarrez sur un nouveau thread avec une pompe de message et effectuez la tâche

sur le thread. Ensuite, attendez que la tâche sur le thread principal bloque le thread principal jusqu'à la fin de la tâche. MessageLoopWorker.Run DoWorkAsync Afin d'annuler la tâche après, vous pouvez utiliser la classe

. La classe

vous permet d'annuler la demande d'un fil à l'autre. CancellationToken CancellationToken Ce qui suit est la méthode de modification du code pour annuler la tâche après les heures supplémentaires:

Dans ce code, nous créons un
<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);

    // 创建一个 CancellationTokenSource。
    using (CancellationTokenSource cancellationTokenSource = new CancellationTokenSource())
    {
        // 设置 5 秒的超时时间。
        using (Timer timer = new Timer(state => cancellationTokenSource.Cancel(), null, 5000, Timeout.Infinite))
        {
            try
            {
                // 使用 CancellationToken 启动任务。
                var task = MessageLoopWorker.Run(DoWorkAsync, cancellationTokenSource.Token, trackingUrl);

                // 等待任务完成。
                task.Wait(cancellationTokenSource.Token);

                // 如果任务成功完成,获取结果。
                if (!string.IsNullOrEmpty(task.Result?.ToString()))
                {
                    return new Uri(task.Result.ToString());
                }
            }
            catch (OperationCanceledException)
            {
                // 任务被取消。
            }
            catch (AggregateException ex)
            {
                // 处理任务中的其他异常
                foreach (var innerException in ex.InnerExceptions)
                {
                    // Log or handle inner exception appropriately
                    Console.WriteLine($"Inner Exception: {innerException.Message}");
                }
            }
        }
    }

    // 如果任务被取消或失败,则返回 null。
    return null;
}</code>
et le passons à la méthode

. Nous avons également réglé une minuterie pour annuler le jeton après 5 secondes. Si la tâche est terminée avec succès avant les heures supplémentaires, nous obtiendrons le résultat. Si la tâche est annulée, nous capturerons CancellationTokenSource. Enfin, nous utilisons des instructions pour libérer les ressources CancellationToken et MessageLoopWorker.Run pour nous assurer que les ressources sont correctement traitées. De plus, un traitement OperationCanceledException est ajouté pour capturer et gérer d'autres anomalies qui peuvent se produire dans la mission using. CancellationTokenSource Timer Cette version améliorée utilise AggregateException des déclarations pour la gestion des ressources appropriée, empêchant les fuites de ressources.

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