Comment limiter le temps d'exécution d'une fonction en c sharp?
J'ai un problème. Je suis en train d'écrire un test et j'ai une fonction que l'autre peut se faire dans les 2 secondes ou après environ 5 minutes(en fonction de l'entrée de données). Et je voudrais arrêter cette fonction, si elle est exécutée pendant plus de 3 secondes...
Comment puis-je le faire?
Merci beaucoup!
source d'informationauteur Novellizator | 2011-09-14
Vous devez vous connecter pour publier un commentaire.
Le meilleur moyen serait que votre fonction peut vérifier son temps d'exécution assez souvent pour décider de l'arrêter, il prend trop de temps.
Si ce n'est pas le cas, alors l'exécution de la fonction dans un thread séparé. Dans votre thread principal commencer à 3 secondes de la minuterie. Lorsque le compte à rebours est écoulé, de tuer le thread séparé à l'aide Fil de discussion.Abort() (bien sûr, sauf si la fonction est déjà plus). Voir des exemples de code et preacuations de l'utilisation de la fonction docs.
Bien..., j'ai eu la même question, et après avoir lu toutes les réponses ici et les blogs, je me suis contenté de cela,
Il me Permet d'exécuter tout bloc de code avec une limite de temps, Déclarer la méthode wrapper
Et de l'utiliser pour envelopper un bloc de code comme ceci
Vous pouvez utiliser le fork/join modèle, dans la Task Parallel Library ceci est mis en œuvre avec De la tâche.WaitAll()
Cela va démarrer l'autre tâche sur un sujet séparé, et puis attendre pour 3000 millisecondes pour elle à la fin. Si elle ne se terminer dans le délai, elle renvoie true, sinon false donc vous pouvez l'utiliser pour décider quoi faire ensuite.
Vous pouvez utiliser un CancellationToken de communiquer à l'autre thread que ce résultat n'est plus nécessaire de sorte qu'il peut arrêter en douceur.
Ce Qui Concerne Gert-Jan
La meilleure façon en C# pour la fonction d'arrêt dans le milieu est le
return
mot clé en fonction, mais comment puis-je savoir quand utiliser lareturn
mot-clé pour arrêter la fonction au milieu, après qu'il dure au moins 3 secondes? LeStopwatch
classe deSystem.Diagnostics
est la réponse. Cette fonction compliquée qui dure entre 2 secondes à 5 minutes (en fonction de l'entrée de données) utilise logiquement de nombreuses boucles, et peut-être même la récursivité, donc ma solution pour vous est que, à la première ligne de code de cette fonction, créez une instance deStopwatch
à l'aide deSystem.Diagnostics
avec lenew
mot-clé, à commencer par l'appel de laStart()
la fonction de Chronomètre de classe, et pour chaque boucle et en boucle, au début, ajoutez le code suivant:(astuce: vous pouvez la saisir avec les mains une fois, le copier Ctrl+C, puis il suffit de le coller Ctrl+V). Si cette fonction utilise la récursivité, afin d'économiser de la mémoire, le Chronomètre instance globale plutôt que de la créer comme instance locale à première, et de démarrer si elle n'est pas en cours d'exécution au début du code. Vous pouvez savoir que le
IsRunning
de la montre de classe. Après cela, demandez si le temps écoulé est de plus de 3 secondes, et si oui (true
) arrêter ou réinitialiser le Chronomètre, et l'utilisation de lareturn
mot-clé pour arrêter la boucle de récursivité, très bon départ dans la fonction, si votre fonction dure longtemps en raison principalement de la récursivité plus de boucles. Qu'il est. Comme vous pouvez le voir, c'est très simple, et j'ai testé cette solution, et les résultats ont montré que cela fonctionne! Essayez-le vous-même!Exécuter cette fonction dans le thread et le tuer au bout de 3 secondes ou vérifier le temps écoulé à l'intérieur de cette fonction(je pense que c'est de la boucle).
Utiliser des OS des rappels avec un salut de compteur de performance, puis de les tuer votre fils, s'il en existe un
Depuis C# et .net framework ne sont pas des environnements temps-réel, vous ne pouvez pas garantir, même les 3 secondes comptent. Même si vous étiez à se rapprocher de cette, vous devez appeler le
if(timeSpan > TimeSpan.FromSeconds(3) then goto endindentifier;
avant chaque appel de la méthode.Tout cela n'est qu'un faux pas, il ya juste aucun moyen fiable de le faire à partir de ce que je sais.
Bien que vous pouvez essayer cette solution
https://web.archive.org/web/20140222210133/http://kossovsky.net/index.php/2009/07/csharp-how-to-limit-method-execution-time
mais je ne voudrais pas faire de telles choses .net application.