2012-10-12 6 views
5

EDYCJA: W systemie Windows Phone wywoływam HttpWebRequest.BeginGetResponse w oddzielnym wątku, który został uruchomiony przez . Następnie dzwonię do MessageBox.Show(). Problem polega na tym, że wywołanie zwrotne nie jest wywoływane, dopóki nie odrzucę MessageBox.Wywołanie funkcji HttpWebRequest jest blokowane przez interfejs użytkownika

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

Czy MessageBox blokuje wywołanie zwrotne w wątku tła?

+3

małe pytanie: dlaczego utworzyć oddzielny wątek 'nowy wątek (getWeb)' dla metody 'getWeb()', że jest już asynchronicznie przez siebie ('request.BeginGetResponse (...)' metoda wykonuje swoje zadanie w tle)? –

+0

Pomysł polega na tym, że będę mieć pętlę na wątku w tle, która będzie nieprzerwanie wysyłać żądania sieciowe z przerwą pomiędzy poszczególnymi żądaniami o kilka minut. Czy rozwiąże on mój problem, jeśli zadzwonię do BeginGetResponse w wątku UI? – user1740959

+0

Może to mieć związek z tym, co przychodzi * po * wywołaniu, czy jest to metoda, która nigdy nie jest wywoływana, czy trafiasz w metodę oddzwaniania i kod, który przekazuje połączenie do interfejsu użytkownika, nie jest wywoływany? Wygląda na to, że masz jakiś impas. – casperOne

Odpowiedz

0

trzeba dodać odwołanie do Microsoft.Phone.Reactive

Spróbuj:

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();" zablokuje twój wątek.

, ale nie sądzę, że jest to powód, dla którego GetResponseCallback nie działa.

możesz go przetestować, skomentuj ten kod.

0

jeśli chcesz używać MessageBox.Show();

następnie umieszczenia tego wewnątrz 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