Pregunta

Tengo una clase que va y agarra algunos datos y los devuelve como una cadena. Si bien este objeto está trabajando hay un icono de giro dejando que el trabajo del usuario saber que se está haciendo. El problema es que las salidas de código antes de la respuesta regresa. Me pegué a

while(response == null)

En sólo para ver que hay de nuevo y el

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

No está disparando. Se dispara bien en una aplicación de consola, así que estoy poniendo esto a algo que estoy haciendo que Silverlight no le gusta, aquí está el código 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));
        }
    }

}
¿Fue útil?

Solución

¿Vas en el bucle ocupado con (while response == null) en el hilo de interfaz de usuario? La devolución de llamada asincrónica para la HttpRequest será entregado en el subproceso de interfaz de usuario, por lo que si usted está en lazo con ese mismo hilo, la devolución de llamada no se puede ejecutar. Es necesario volver a permitir que el bucle principal mensaje a correr, y luego será entregado a su devolución de llamada asincrónica.

Su diseño anterior sugiere que lo que realmente quiere es un fetch sincrónica de todos modos. Olvidar la devolución de llamada y llamada simplemente FinaliseAsyncRequest dentro ReadFromUrl mismo. La interfaz de usuario se bloqueará hasta que se complete la solicitud, pero parece que eso es lo que desea.

Otros consejos

Me ha escrito una muestra de trabajar aquí utilizando WebClient y HttpWebRequest.

cliente Web, y HttpWebRequest el hilo de interfaz de usuario en Windows Phone 7

Tenga en cuenta este último se prefiere para cualquier procesamiento no trivial para evitar el bloqueo de la interfaz de usuario.

Siéntase libre de reutilizar el código.

La forma más fácil de obtener una cadena desde un servidor web es utilizar WebClient.DownloadStringAsync() ( docs MSDN ).

intentar algo como esto:

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

Tenga en cuenta que se ejecuta la devolución de llamada en el subproceso de interfaz de usuario y lo que sólo debe utilizar este método si el método de devolución de llamada no está haciendo mucho ya que bloqueará la interfaz de usuario mientras se ejecuta.

Si necesita más control sobre la solicitud web, puede utilizar HttpWebRequest.

Si realmente tiene que imitar el comportamiento síncrono echar un vistazo a las llamadas síncronas Falsificación en Silverlight WP7

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top