Bonjour, j'ai une fonction qui transmet l'URL Obtenir des paramètres à un fichier PHP sur un serveur Web et attend une réponse du fichier (prend normalement 10-20 secondes). Je veux mettre cela à l'intérieur d'une boucle car je dois envoyer ces demandes d'obtention d'environ 5 fichiers PHP différents à la fois, mais lorsque j'essaie de l'ajouter à une boucle, la fonction fait attendre la boucle jusqu'à ce que le fichier renvoie la réponse avant d'aller sur le prochain.
public string HttpGet(string URI, string Parameters) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URI + Parameters); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader resStream = new StreamReader(response.GetResponseStream()); return resStream.ReadToEnd().Trim(); } private void SendCommand() { for( int i = 0; i <= 4; i++) { AddRTB(HttpGet(url, paramater)); } }
4 Réponses :
Au lieu d'utiliser la méthode getResponse () Code> Vous pouvez utiliser le
BegingreResponse () Code>
qui est un appel non bloquant. Il faut un rappel qui peut ensuite gérer l'objet code> webresponse code> quand il retourne enfin. L'exemple dans le lien vous donnera une bonne idée de la façon de faire attendre le fil principal d'attendre que toutes les réponses reviennent. p>
au lieu de GetResponse, utilisez la méthode de la classe de demande de GetReSetresesese. L'échantillon et la documentation peuvent être trouvés sur http: // msdn. microsoft.com/en-us/library/system.net.httpwebrequest.begingreesponse.aspx p>
Utilisez WebClient avec des méthodes asynchrones. p>
commence \ end est plus difficile à utiliser. P>
Voici deux approches qui utilisent le TPL.
Le premier attend pour toutes les demandes de remplir avant d'accéder à l'un des résultats p> et la seconde fait quelque chose avec chaque résultat car il s'agit de: P > for (int ii = 0; ii <= 4; ii++)
{
var wreq = (HttpWebRequest)WebRequest.Create("..." + ii);
var taskResp = Task.Factory.FromAsync<WebResponse>(wreq.BeginGetResponse,
wreq.EndGetResponse,
null);
taskResp.ContinueWith(tsk => new StreamReader(tsk.Result.GetResponseStream()).ReadToEnd().Trim())
.ContinueWith((Task<string> trs) =>
{
var result = trs.Result;
DoSomthingWithTheResult(result);
});
}
+1. Même si @ Linuxuser27 réponse n'a rien de mal, celui-ci répond mieux à la question et sera beaucoup plus facile à mettre en œuvre.
+1 En effet c'est. La méthode continue avec () code> est une bonne idée.
Et comment cela changerait-il si je dois envoyer des données avec demande de post HTTP avec BegingeTeQuestStream / endgetrequetsteam? Stackoverflow.com/Questtions/4190903
Le filetage est le moyen d'aller pour cela, bien que vous devriez attendre tous les 5 pour répondre avant de continuer.