2012-10-12 27 views
5

封鎖編輯:在Windows Phone上我打電話HttpWebRequest.BeginGetResponse在一個單獨的線程上, 我開始。然後我調用MessageBox.Show()。問題是直到我關閉MessageBox時才調用回調函數。HttpWebRequest回調被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(); 

MessageBox應該阻塞後臺線程的回調嗎?

+3

小問題裏面:你爲什麼要創建單獨的線程'新主題(getWeb)'的方法'getWeb()'那已經是異步('request.BeginGetResponse(...)'方法在後臺執行它的工作)? –

+0

這個想法是,我將在後臺線程上有一個循環,在每個請求之間停頓幾分鐘,連續發送Web請求。如果我在UI線程中調用BeginGetResponse,它會解決我的問題嗎? – user1740959

+0

它可能與調用之後的內容*有關,它是否永遠不會調用該方法,或者您打回調方法,並且將調用回UI的代碼不調用?看起來你正在發生某種僵局。 – casperOne

回答

0

需要添加引用Microsoft.Phone.Reactive

試試這個:

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();」會阻止你的UI線程。

但我不認爲這是GetResponseCallback無法運行的原因。

你可以測試它,評論該代碼。

0

,如果你想使用MessageBox.Show();

然後將一個本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