Question

Je dois utiliser une API pour faire un appel à un tiers, et idéalement utiliser la réponse qu'elle retourne. L'API a intégré délai de 30 secondes, et ne vous permet pas de définir cette programmation. Je besoin en temps, en 12 secondes. Voici l'appel que je fais:

= réponse de la chaîne theAPI.FunctionA (a, b, c, d);

J'ai pensé que je pourrais avoir besoin d'utiliser les appels pour accomplir async ce propos et interrompra le fil à 12 secondes. Une autre question stackoverflow semble se rapprocher de ce que je considère: mettre en œuvre C # générique Délai d'attente

... Je me demande si cela est la meilleure façon. Plus précisément, je continue à voir des articles que vous préviens d'appeler EndInvoke, peu importe quoi, et je me demande si Abandonner comme dans l'exemple référencé sera toujours fermer le fil de façon appropriée? Je vois qu'il y avait des commentaires avec beaucoup d'inquiétude sur l'utilisation Abandonner.

Était-ce utile?

La solution

est généralement Aborting fils une mauvaise idée. Pourquoi ne pas simplement laisser l'appel complet (ou le temps au bout de 30 secondes), mais ignorer le résultat (et passer à autre chose) si elle prend plus de 12 secondes?

Autres conseils

Thread.Abort fermera le fil, bien sûr, comme il appellera Win32 TerminateThread .

Résultat de cette action dépendra de la façon dont votre API aime être fermé par TerminateThread.

Si votre méthode est appelée somthing comme NuclearPlant.MoveRod() ou Defibrillator.Shock(), je préfère attendre ces 30 secondes.

Cette méthode donne aucune chance à la victime de faire un nettoyage:

  

TerminateThread est utilisé pour entraîner un fil pour quitter. Lorsque cela se produit, le fil cible n'a aucune chance d'exécuter un code en mode utilisateur . DLLs attachées au fil ne sont pas informés que le fil se termine. Le système libère la pile initiale du fil.

Comme indiqué dans MSDN:

  

TerminateThread est une fonction dangereuse qui ne doit être utilisé dans les cas les plus extrêmes. Vous devez appeler TerminateThread seulement si vous savez exactement ce que le fil cible fait, et vous contrôlez tout le code que le fil cible pourrait être en cours d'exécution au moment de la résiliation. Par exemple, TerminateThread peut entraîner les problèmes suivants:

     
      
  • Si le thread cible possède une section critique, la section critique ne sera pas publié.
  •   
  • Si le thread cible est allouez de la mémoire dans le tas, le verrou de tas ne sera pas publié.
  •   
  • Si le thread cible exécute certains appels kernel32 lorsqu'il est mis fin, l'état kernel32 pour le processus du fil pourrait être incompatible.
  •   
  • Si le thread cible est manipulait l'état global d'une DLL partagée, l'état de la DLL pourrait être détruite, affecter les autres utilisateurs de la DLL.
  •   
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top