2008-11-13 7 views
3

Je n'ai pas été en mesure de trouver un moyen d'annuler/terminer une opération de lecture asynchrone après HttpWebRequest réussie. Il n'y a aucun moyen de définir le délai, ThreadPool.RegisterWaitForSingleObject ne fonctionne pas aussi. Et la fermeture du socket sous-jacent n'est pas non plus une option car ni HttpWebRequest/Reponse ne lui donne accès..NET annuler le flux BeginRead

Edit:

Malheureusement, cette approche qui fonctionne seulement pour suggestet de Sunny HttpWebRequest.BeginGetResponse. Pour le flux que vous obtenez après GetResponseStream() pour une raison quelconque, RegisterWaitForSingleObject ne fonctionne pas - le callback n'est jamais appelé. La situation est la suivante: J'ai une application qui utilise HttpGetRequest. Il est construit en utilisant l'exemple MSDN par défaut pour async httpwebrequest. Obtenir une réponse fonctionne comme un charme. Mais en de rares occasions, le serveur auquel se connecte mon httpwebrequest oublie de fermer le socket. Je suis donc accroché à une lecture infinie de BeginRead.

Dans quelques rares occasions, l'autre serveur oublie

Répondre

1

Pourquoi ne pas RegisterWaitForSingleObject? Vous pouvez l'utiliser pour un délai d'expiration et, dans le gestionnaire, vous pouvez appeler request.Abort(). Il s'agit d'un example. Btw, j'ai utilisé l'approche simial avant de trouver cet article dans le passé, et cela a fonctionné comme un charme.

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

EDIT: Si le RegisterWaitForSingleObject n'est jamais appelé, alors vous avez un autre problème, qui est probablement un ThreadPool n'ayant pas assez de threads libres. Le rappel pour 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. Rendre vos pages asynchrones. Why? How.
  2. Modifier le max threads in the pool.

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

I nazdrave :)