Maison > développement back-end > C++ > Comment puis-je implémenter un délai d'attente générique pour une seule ligne de code en C# ?

Comment puis-je implémenter un délai d'attente générique pour une seule ligne de code en C# ?

Barbara Streisand
Libérer: 2025-01-23 12:06:17
original
1017 Les gens l'ont consulté

How Can I Implement a Generic Timeout for a Single Line of Code in C#?

Implémentation d'un mécanisme universel de timeout de code en C#

Question :

Comment créer une méthode générique en C# qui exécute une seule ligne de code dans un délai d'attente donné ? Ceci est utile pour travailler avec du code qui ne peut pas être modifié et qui peut causer des problèmes, et pour terminer l'exécution du code après un délai d'attente.

Réponse :

La mise en œuvre d'un gestionnaire de délai d'attente générique nécessite une réflexion approfondie, notamment en termes d'arrêt du code problématique après un délai d'attente. La solution suivante combine les expressions lambda et le threading.

La méthode clé

est CallWithTimeout qui accepte le code à exécuter (un délégué Action) et le délai d'attente souhaité en millisecondes.

Mise en œuvre :

<code class="language-csharp">    static void CallWithTimeout(Action action, int timeoutMilliseconds)
    {
        Thread threadToKill = null;
        Action wrappedAction = () =>
        {
            threadToKill = Thread.CurrentThread;
            try
            {
                action();
            }
            catch (ThreadAbortException ex)
            {
                Thread.ResetAbort(); // 取消强制中止以实现优雅退出。
            }
        };

        IAsyncResult result = wrappedAction.BeginInvoke(null, null);
        if (result.AsyncWaitHandle.WaitOne(timeoutMilliseconds))
        {
            wrappedAction.EndInvoke(result);
        }
        else
        {
            threadToKill.Abort();
            throw new TimeoutException();
        }
    }</code>
Copier après la connexion

Utilisation :

La méthode

CallWithTimeout peut être utilisée de la manière suivante :

<code class="language-csharp">    static void Main(string[] args)
    {
        // 调用一个执行时间为5秒的方法,设置6秒的超时时间
        CallWithTimeout(FiveSecondMethod, 6000);

        // 调用同一个方法,设置4秒的超时时间,这将触发超时异常
        CallWithTimeout(FiveSecondMethod, 4000);
    }

    static void FiveSecondMethod()
    {
        Thread.Sleep(5000);
    }</code>
Copier après la connexion

Dans cet exemple, FiveSecondMethod s'exécutera avec succès dans le délai d'attente de 6 secondes, mais lancera une exception TimeoutException dans le délai d'attente de 4 secondes.

Remarque :

Le code ci-dessus annule le thread d'expiration en abandonnant le thread, ce qui peut ne pas être idéal dans certains cas. Si une méthode d’annulation plus élégante est requise, d’autres mécanismes peuvent être mis en œuvre.

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