Question

Je n'ai pas trouvé le moyen d'annuler / mettre fin à l'opération de lecture asynchrone après la réussite de HttpWebRequest. ThreadPool.RegisterWaitForSingleObject ne fonctionne pas non plus. Et fermer le socket sous-jacent n’est pas une option aussi, car HttpWebRequest / Reponse ne lui donne pas accès.

Modifier:

Malheureusement, cette approche de Sunny suggestet ne fonctionne que pour HttpWebRequest.BeginGetResponse. Pour le flux que vous obtenez après GetResponseStream () pour une raison quelconque, RegisterWaitForSingleObject ne fonctionne pas - le rappel n'est jamais appelé.

La situation est la suivante: J'ai une application qui utilise HttpGetRequest. Il est créé à l'aide de l'exemple MSDN par défaut pour httpwebrequest asynchrone. Obtenir une réponse fonctionne comme un charme. Mais dans de rares cas, le serveur auquel mon httpwebrequest se connecte oublie de fermer le socket. Je suis donc suspendu à une lecture infinie de BeginRead.

Dans de rares cas, l’autre serveur oublie

Était-ce utile?

La solution

Pourquoi ne pas enregistrerWaitForSingleObject? Vous pouvez l'utiliser pour le délai d'expiration et, dans le gestionnaire, vous pouvez appeler request.Abort ().

Voici un exemple . Btw, j'ai utilisé l'approche simial avant de trouver cet article dans le passé, et cela a fonctionné à merveille.

REMARQUE: la fin réelle de l'opération se produira lors du prochain Stream.Read (seule la requête / réponse était asynchrone) ou Stream.EndRead (si la lecture est également asynchrone). Vous devez toujours capturer l'exception levée dans le gestionnaire EndXXXX.

EDIT: Si le RegisterWaitForSingleObject n'est jamais appelé, vous avez un autre problème, qui est probablement un ThreadPool n'ayant pas assez de threads libres. Le rappel de l'objet RegisterWaitForSingle est appelé sur un thread ThreadPool, et s'il n'y a pas de thread libre dans le pool, il ne sera jamais appelé. Vous avez des solutions:

  1. Rendez vos pages asynchrones. Pourquoi ? Comment .
  2. Modifiez les nombre maximal de threads dans le pool .

Dans tous les cas, augmenter la taille du pool ne vous aidera pas beaucoup. Vous devez inspecter votre code pour rechercher les fuites de ressources (flux) et vous assurer que vous appelez non seulement request.Abort (), mais fermez également la réponse. Assurez-vous que dans vos rappels, vous utilisez la méthode EndXXX appropriée, etc.

Je nazdrave:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top