2012-10-12 65 views
5

EDITADO: En Windows Phone llamo a HttpWebRequest.BeginGetResponse en un hilo separado que comencé. Luego llamo a MessageBox.Show(). El problema es que no se llama a la devolución de llamada hasta que descarto el MessageBox.La devolución de llamada de HttpWebRequest está bloqueada por UI

void GetResponseCallback(IAsyncResult asynchronousResult) { 
    //Not getting called until I dismiss MessageBox 
} 

void getWeb() { 
    Thread.Sleep(1000); 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url)); 
    request.Method = "GET"; 
    request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request); 
} 

new Thread(getWeb).Start(); //Start a new thread 
MessageBox.Show(); 

¿Debería el MessageBox estar bloqueando la devolución de llamada en el hilo de fondo?

+3

pequeña pregunta: ¿Por qué crear hilo separado 'nueva rosca (GetWeb)' para el método 'GetWeb()' que ya es asíncrono por sí mismo (el método 'request.BeginGetResponse (...)' hace su trabajo en segundo plano)? –

+0

La idea es que tendré un bucle en el hilo de fondo que continuamente envía solicitudes web con una pausa de un par de minutos entre cada solicitud. ¿Resolverá mi problema si llamo a BeginGetResponse en el hilo de UI? – user1740959

+0

Podría tener que ver con lo que viene * después * de la llamada, ¿No se está llamando nunca al método, o se pulsa el método de devolución de llamada y no se llama al código que dirige la llamada a la IU? Parece que tienes algún tipo de estancamiento. – casperOne

Respuesta

0

que añadir una referencia a Microsoft.Phone.Reactive

Prueba esto:

private void PushMe_Click(object sender, RoutedEventArgs e) 
     { 
      var scheduler = Scheduler.NewThread; 
      scheduler.Schedule(action => GetWeb());   
      MessageBox.Show("This is a test.", "Test caption.", MessageBoxButton.OK); 
     } 

     private void GetWeb() 
     { 
      Thread.Sleep(3000); 
      var httpWebRequest = (HttpWebRequest) WebRequest.Create("http://www.stackoverflow.com"); 
      httpWebRequest.Method = "GET"; 

      httpWebRequest.BeginGetResponse(BeginGetResponseCallback, httpWebRequest); 
     } 

     private void BeginGetResponseCallback(IAsyncResult ar) 
     { 

     } 
0

"MessageBox.Show();" bloqueará su hilo de interfaz de usuario.

pero no creo que sea la razón por la que GetResponseCallback no se ejecuta.

lo puedes probar, comenta ese código.

0

si desea utilizar MessageBox.Show();

luego coloque una esto dentro dispacher

void GetResponseCallback(IAsyncResult asynchronousResult) 
{ 
    Dispatcher.BeginInvoke(() => 
    { 
     MessageBox.Show("Done"); 
    }); 

} 

void getWeb() { 
    Thread.Sleep(1000); 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url)); 
    request.Method = "GET"; 
    request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request); 
} 

new Thread(getWeb).Start(); //Start a new thread 
Cuestiones relacionadas