Implémentation d'un mécanisme de timeout universel en C#
Un besoin courant en programmation est de pouvoir exécuter du code avec un délai d'attente spécifié. Cela devient critique lorsqu’il s’agit de systèmes externes ou de code dont l’exécution peut prendre trop de temps. La mise en œuvre d'un mécanisme de délai d'attente commun permet un comportement cohérent sur l'ensemble de la base de code, garantissant que le code qui ne répond pas est traité de manière appropriée.
Dans ce cas, l'objectif est de créer une méthode générique capable d'exécuter n'importe quel code donné dans un délai d'attente spécifié. La solution doit gérer avec élégance les situations dans lesquelles le code dépasse le délai d'attente et fournir un mécanisme pour arrêter son exécution.
Une façon élégante d’y parvenir est d’utiliser des délégués. L'extrait de code suivant illustre une méthode de délai d'attente générique nommée CallWithTimeout qui accepte un délégué d'action et une valeur de délai d'attente en millisecondes :
<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>
Dans cette méthode, un thread séparé est créé pour effectuer l'opération donnée. La clé pour contrôler l’exécution est d’utiliser un délégué d’encapsulation qui capture une référence au thread. Si l'opération dépasse le délai d'attente, le thread se termine correctement et une TimeoutException est levée.
En utilisant ce mécanisme de délai d'attente universel, les développeurs peuvent facilement protéger leur code contre les systèmes externes ou les blocs de code qui ne répondent pas. Il favorise un comportement robuste des applications et améliore la gestion des exceptions potentielles.
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!