Question

J'ai une classe qui va et saisit des données et le renvoie sous forme de chaîne. Bien que cet objet fonctionne il y a une rotation icône laisser le travail de savoir utilisateur est fait. Le problème est la sortie de code avant que la réponse revient. Je coincé un

while(response == null)

juste pour voir ce qui se passe et

response = (HttpWebResponse)request.EndGetResponse(AsyncResult);

n'est pas de tir. Il tire ok dans une application de la console, donc je suis en train de cela à quelque chose que je fais qui ne silverlight pas comme, voici le code complet:

public class HttpWorker
{
    private HttpWebRequest request;
    private HttpWebResponse response;
    private string responseAsString;
    private string url;

    public HttpWorker()
    {

    }

    public string ReadFromUrl(string Url)
    {
        url = Url;
        request = (HttpWebRequest)WebRequest.Create(url);

        request.CookieContainer = new CookieContainer();
        request.AllowAutoRedirect = true;
        request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6";

        AsyncRequest(); // The Demon!

        return responseAsString;
    }

    private void AsyncRequest()
    {
        request.BeginGetResponse(new AsyncCallback(FinaliseAsyncRequest), null);
    }

    private void FinaliseAsyncRequest(IAsyncResult AsyncResult)
    {
        response = (HttpWebResponse)request.EndGetResponse(AsyncResult);


        if (response.StatusCode == HttpStatusCode.OK)
        {
            // Create the stream, encoder and reader.
            Stream responseStream = response.GetResponseStream();
            Encoding streamEncoder = Encoding.UTF8;
            StreamReader responseReader = new StreamReader(responseStream, streamEncoder);
            responseAsString = responseReader.ReadToEnd();
        }
        else
        {
            throw new Exception(String.Format("Response Not Valid {0}", response.StatusCode));
        }
    }

}
Était-ce utile?

La solution

Allez-vous dans la boucle occupée avec (while response == null) sur le thread d'interface utilisateur? Le rappel async pour le HttpRequest sera livré sur le thread d'interface utilisateur, donc si vous êtes en boucle sur ce même fil, le rappel ne peut jamais fonctionner. Vous devez revenir pour permettre à la boucle principale du message à exécuter, puis votre rappel async sera livré.

Votre conception ci-dessus suggère que ce que vous voulez vraiment est synchrone de toute façon d'extraction. Oubliez le rappel et FinaliseAsyncRequest simplement appel à l'intérieur ReadFromUrl vous. L'interface utilisateur se bloque jusqu'à ce que le finalise demande, mais il semble que c'est ce que vous voulez.

Autres conseils

J'affiché un échantillon de travail ici et d'utiliser WebClient HttpWebRequest.

WebClient, HttpWebRequest et l'interface utilisateur fil sur Windows Phone 7

Remarque celle-ci est préférée pour tout traitement non trivial pour éviter le blocage de l'interface utilisateur.

Sentez-vous libre de réutiliser le code.

La meilleure façon d'obtenir une chaîne à partir d'un serveur Web est d'utiliser WebClient.DownloadStringAsync() ( MSDN docs ).

Essayez quelque chose comme ceci:

private void DownloadString(string address)
{
    WebClient client = new WebClient();
    Uri uri = new Uri(address);

    client.DownloadStringCompleted += DownloadStringCallback;
    client.DownloadStringAsync(uri);

    StartWaitAnimation();
}


private void DownloadStringCallback(object sender, DownloadStringCompletedEventArgs e)
{
    // Do something with e.Result (which is the returned string)

    StopWaitAnimation();
}

Notez que le rappel exécute sur le thread d'interface utilisateur et donc vous ne devez utiliser cette méthode si votre méthode de rappel ne fait pas très bien car il bloque l'interface utilisateur alors qu'il exécute.

Si vous avez besoin de plus de contrôle sur la demande Web que vous pouvez ensuite utiliser HttpWebRequest.

Si vous devez vraiment imiter le comportement synchrone consulter Faking appels synchrones dans Silverlight WP7

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