Maison >développement back-end >C++ >Comment puis-je implémenter un mécanisme de délai d'attente générique en C# pour empêcher les processus de longue durée ?

Comment puis-je implémenter un mécanisme de délai d'attente générique en C# pour empêcher les processus de longue durée ?

DDD
DDDoriginal
2025-01-23 12:11:13259parcourir

How Can I Implement a Generic Timeout Mechanism in C# to Prevent Long-Running Processes?

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

En programmation, il est souvent nécessaire de fixer des délais d'exécution du code afin d'éviter que des processus de longue durée ne bloquent ou ne stagnent l'application. Pour cette raison, il est crucial de mettre en œuvre un mécanisme de délai d’attente commun et efficace.

Supposons que vous ayez une méthode qui se termine normalement en 30 secondes, mais que vous souhaitiez mettre fin à son exécution lorsqu'elle dépasse une minute. Comment puis-je y parvenir sans délais d'attente de codage en dur pour des méthodes spécifiques ?

Heureusement, C# fournit une solution via une méthode d'implémentation de délai d'attente commune. Explorons un exemple pratique.

Mécanisme de délai d'attente

Notre objectif est de créer une méthode nommée CallWithTimeout qui exécutera une seule ligne de code ou un délégué anonyme dans un délai d'attente spécifié. Si le délai expire, l'exécution du délégué doit être arrêtée et une exception TimeoutException doit être levée.

Détails de mise en œuvre

Le principal défi est de mettre fin à l'exécution du délégué après un délai d'attente. Ceci est réalisé grâce à une utilisation intelligente des délégués d’encapsulation et des opérations de thread.

  1. Délégué wrapper : Nous créons un délégué wrapper qui capture le thread d'exécution du délégué dans une variable locale. Cela se fait dans la méthode qui crée le délégué.
  2. Exécution asynchrone : le délégué wrapper est passé en argument à BeginInvoke, qui démarre l'exécution asynchrone. La propriété IAsyncResult de l'objet AsyncWaitHandle renvoyé est utilisée pour vérifier si le délégué a terminé dans le délai imparti.
  3. Gestion du délai d'attente : Si le délégué termine avant l'expiration du délai, EndInvoke est appelé pour terminer son exécution. Cependant, si un délai d'attente se produit, AsyncWaitHandle renverra false indiquant que le délégué est toujours en cours d'exécution. Dans ce cas, threadToKill.Abort() sera utilisé pour terminer le thread d'exécution.
  4. Annulation du fil : L'abandon du fil est intercepté par le bloc catch et ThreadAbortException est lancé pour indiquer que le délégué a été interrompu prématurément.

Utilisation

Vous pouvez utiliser la méthode CallWithTimeout à plusieurs endroits de votre code chaque fois que vous devez vous assurer qu'un code spécifique est exécuté dans un délai prédéfini. Vous pouvez facilement configurer et exécuter des opérations chronométrées en passant le délégué et le délai d'attente comme paramètres.

Conclusion

L'implémentation d'un mécanisme de délai d'attente commun en C# vous permet de contrôler efficacement le temps d'exécution des délégués et des threads. L'exemple fourni illustre une solution puissante et élégante qui inclut la possibilité de mettre fin aux tâches de longue durée. Cette approche permet d'éviter les blocages et garantit que votre application reste réactive et performante.

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