Maison > développement back-end > C++ > Comment puis-je implémenter un mécanisme de délai d'attente générique pour l'exécution de code en C# ?

Comment puis-je implémenter un mécanisme de délai d'attente générique pour l'exécution de code en C# ?

Susan Sarandon
Libérer: 2025-01-23 12:01:12
original
984 Les gens l'ont consulté

How Can I Implement a Generic Timeout Mechanism for Code Execution in C#?

Mécanisme de délai d'expiration d'exécution de code universel C# : un guide complet

Dans le développement de logiciels, contrôler le temps d'exécution des blocs de code est crucial, en particulier lorsqu'il s'agit de dépendances externes peu fiables ou chronophages telles que les appels d'API ou les requêtes de base de données. Pour ce faire, une méthode courante pour définir des délais d'attente pour des lignes de code uniques est nécessaire.

Mettre en œuvre un mécanisme de délai d'attente universel

L'essentiel de la création d'un mécanisme de délai d'attente universel est de mettre fin au code de longue durée et d'intercepter les erreurs possibles. Pour cela nous pouvons adopter une solution à plusieurs niveaux :

  • Délégué enveloppé : Crée un délégué qui capture le code cible et donne accès au handle du fil.
  • Méthode d'exécution du délai d'attente : Crée une méthode (telle que CallWithTimeout) qui reçoit une opération et une durée d'expiration en entrée. Cette méthode démarre l'exécution du code sur un thread distinct et attache un délégué d'encapsulation pour suivre la progression.
  • Terminaison du thread : Après l'expiration du délai, terminez le thread responsable du code de longue durée et lancez TimeoutException.

Fonctionnement pratique

Voici les détails spécifiques de mise en œuvre :

<code class="language-csharp">class Program
{
    static void Main(string[] args)
    {
        // 设置 6000 毫秒(6 秒)的超时
        CallWithTimeout(FiveSecondMethod, 6000);

        // 设置 4000 毫秒(4 秒)的超时
        CallWithTimeout(FiveSecondMethod, 4000);
    }

    static void FiveSecondMethod()
    {
        Thread.Sleep(5000);
    }
}

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

Cette implémentation vous permet d'exécuter du code avec des délais d'attente bien définis tout en offrant une flexibilité et un contrôle élégant de l'exécution.

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