6
votes

WebRequests asynchrones utilisant C #

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));
        }
    }


1 commentaires

Le filetage est le moyen d'aller pour cela, bien que vous devriez attendre tous les 5 pour répondre avant de continuer.


4 Réponses :


9
votes

Au lieu d'utiliser la méthode getResponse () Vous pouvez utiliser le BegingreResponse () qui est un appel non bloquant. Il faut un rappel qui peut ensuite gérer l'objet webresponse 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.


0 commentaires

1
votes

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


0 commentaires

0
votes

Utilisez WebClient avec des méthodes asynchrones.

commence \ end est plus difficile à utiliser.


0 commentaires

9
votes

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> xxx pré>

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);
                });
}


3 commentaires

+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 () 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