Jeu de délai d'attente pour une opération
J'ai de l'objet obj
qui est la 3ème partie de la composante,
//this could take more than 30 seconds
int result = obj.PerformInitTransaction();
Je ne sais pas ce qui se passe à l'intérieur.
Ce que je sais, c'est si c'prendre plus de temps, il est échoué.
comment configurer un mécanisme d'expiration de cette opération, de sorte que si cela prend plus de 30 secondes, je viens de jeter MoreThan30SecondsException
?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez exécuter l'opération dans un thread séparé et puis mettre un timeout sur le fil opération de jointure:
Exception
je lance ne doit pas être unThreadAbortException
, qui est quelque chose qui arrive par le CLR lors d'un appelAbort
est faite.Plus simplement à l'aide de
Tâche.Attendre(TimeSpan)
:Si vous ne voulez pas bloquer le thread principal, vous pouvez utiliser un Système.Le filetage.Minuterie:
Jon Skeet a moins d'user de la manière forte (L'Arrêt De Threads De Travail Gracieusement) de l'arrêt du thread que de l'abandonner.
Cependant, comme vous n'êtes pas dans le contrôle des opérations
PerformInitTransaction()
fait il n'y a pas beaucoup que vous pouvez faire à partir de quand Abandonner échoue et les feuilles de l'objet dans un état non valide. Tel que mentionné si vous êtes en mesure pour le nettoyage de tout ce que l'abandon de laPerformInitTransaction
a laissé en suspens, vous pouvez le faire par la capture de l'ThreadAbortException
, même si, comme c'est un 3ème appel du parti, il va dire de deviner l'état où vous l'avez laissé leur méthode.La
PerformInitTransaction
devrait vraiment être le seul à l'expiration du délai.Vous devez être prudent au sujet de l'abandon d'une opération de ce genre, surtout que c'est dans une 3ème partie composant que vous avez (peut-être) n'ont pas accès au code afin de le modifier.
Si vous annuler l'opération, alors vous ne savez pas dans quel état vous avez laissé la classe sous-jacente dans. Par exemple, il peut avoir acquis une serrure, et votre sujet a causé la serrure pour être libéré. Même si vous détruisez l'objet après l'abandon de l'opération, elle peut avoir modifié un certain état qui est globale et, par conséquent, vous ne serez pas en mesure fiable de créer une nouvelle instance, sans redémarrage.
Voici deux implémentations qui a également jeter toute exception qui se produit à l'intérieur de la tâche.
Pour les actions (pas de valeur de retour):
Pour Funcs (avec une valeur de retour):
Vous pouvez regarder à l'invocation de la méthode dans un thread et sur le délai d'attente, interrompre le fil et de soulever l'exception. Aussi, vous avez à gérer la ThreadBorted Exception dans ce cas.
Il est un bel exemple d'une solution générique à présent à l'aide d'une classe d'assistance ici.
Il utilise l'Action de déléguer afin d'éviter la création de Thread/destruction montré dans l'exemple précédent.
J'espère que cette aide.
c'est ce que j'allais utiliser. fonctionne de manière similaire à la façon dont un javascript délai d'attente de travaux.
J'ai juste couru dans ce dans une .NET 4.0 application (pas d'accès à
Task.Run
,Task.Delay
, etc.). Si vous voulez bien excuser la dernière ligne (ce qui est le setTimeout partie), c'est assez concis.Je pense que c'est plus simple de toutes: