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>
Utilisation :
La méthodeCallWithTimeout
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>
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!