Domanda

Ho una classe che va e afferra alcuni dati e li restituisce come una stringa. Anche se questo oggetto è in funzione c'è una filatura icona di lasciare il lavoro Know utente è stato fatto. Il problema è che le uscite del codice prima che la risposta ritorna. Ho bloccato un

while(response == null)

Nel solo per vedere che cosa sta succedendo e la

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

non è sparare. Spara ok in un'applicazione di console in modo sto mettendo questo fino a una cosa che sto facendo che Silverlight non come, ecco il codice completo:

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

}
È stato utile?

Soluzione

Stai andando in loop occupato con (while response == null) sul thread UI? Il callback asincrono per il HttpRequest sarà consegnato sul thread UI, quindi se siete loop sullo stesso filo, la richiamata non potrà mai funzionare. È necessario tornare per consentire il ciclo di messaggi principale per l'esecuzione, e quindi il callback asincroni verrà consegnato.

Il vostro disegno sopra suggerisce che ciò che si vuole veramente è un sincrono fetch comunque. Dimenticate il callback e FinaliseAsyncRequest basta chiamare all'interno ReadFromUrl te stesso. L'interfaccia utente si bloccherà fino al completamento della richiesta, ma suona come questo è ciò che si desidera.

Altri suggerimenti

ho postato un campione che lavora qui di utilizzare WebClient e HttpWebRequest.

WebClient, HttpWebRequest e thread dell'interfaccia utente su Windows Phone 7

Si noti quest'ultimo è preferito per eventuali trattamenti non banale per evitare di bloccare l'interfaccia utente.

Sentitevi liberi di riutilizzare il codice.

Il modo più semplice per ottenere una stringa da un server web è quello di utilizzare WebClient.DownloadStringAsync() ( documentazione MSDN ).

provare qualcosa di simile:

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

Si noti che l'esecuzione della richiamata sul thread dell'interfaccia utente e così si dovrebbe usare solo questo metodo se il metodo di callback non sta facendo molto in quanto bloccherà l'interfaccia utente durante la sua esecuzione.

Se avete bisogno di un maggiore controllo sulla richiesta Web, è possibile utilizzare HttpWebRequest.

Se davvero si deve imitare il comportamento sincrono dare un'occhiata alla Faking chiamate sincrone in Silverlight WP7

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top