2012-10-12 11 views
5

MODIFICATO: su Windows Phone Sto chiamando HttpWebRequest.BeginGetResponse su un thread separato che è stato avviato . Quindi chiamo MessageBox.Show(). Il problema è che il callback non viene chiamato fino a quando non congedo il MessageBox.HttpWebRequest callback è bloccato dall'interfaccia utente

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

Il MessageBox deve bloccare la richiamata sul thread in background?

+3

piccola domanda: perché si fa a creare thread separato 'new Thread (GetWeb)' per il metodo 'GetWeb()' che è già asincrono da solo (il metodo 'request.BeginGetResponse (...)' fa il suo lavoro in background)? –

+0

L'idea è che avrò un ciclo sul thread in background che invia continuamente richieste web con una pausa di un paio di minuti tra ogni richiesta. Risolverà il mio problema se chiamo BeginGetResponse nel thread dell'interfaccia utente? – user1740959

+0

Potrebbe avere a che fare con ciò che viene * dopo * anche la chiamata, il metodo non viene mai chiamato, o si colpisce il metodo di callback e non viene chiamato il codice che effettua il marshalling della chiamata all'interfaccia utente? Sembra che tu abbia una sorta di stallo in corso. – casperOne

risposta

0

Hai bisogno di aggiungere un riferimento a Microsoft.Phone.Reactive

Prova questo:

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();" bloccherà il tuo thread ui.

ma non penso che sia il motivo per cui GetResponseCallback non viene eseguito.

puoi testarlo, commentare quel codice.

0

se si desidera utilizzare MessageBox.Show();

quindi inserire un presente all'interno 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 
Problemi correlati