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
Susan Sarandonoriginal
2025-01-23 12:01:121077parcourir

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>

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!

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