2012-10-12 10 views
5

द्वारा अवरोधित किया गया है: विंडोज फोन पर मैं HttpWebRequest.BeginGetResponse पर एक अलग थ्रेड पर पर कॉल कर रहा हूं। फिर मैं MessageBox.Show() को कॉल करता हूं। समस्या यह है कि जब तक मैं संदेशबॉक्स को खारिज नहीं करता तब तक कॉलबैक नहीं कहा जाता है।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(); 

क्या संदेशबॉक्स पृष्ठभूमि थ्रेड पर कॉलबैक को अवरुद्ध कर रहा है?

+3

थोड़ा प्रश्न के अंदर एक इस जगह चाहते हैं: तुम क्यों अलग थ्रेड बना सकता हूँ 'नई थ्रेड (getWeb)' विधि के लिए 'getWeb()' कि पहले से ही async है ('request.BeginGetResponse (...) 'विधि पृष्ठभूमि में अपना काम करता है)? –

+0

विचार यह है कि मेरे पास पृष्ठभूमि थ्रेड पर एक लूप होगा जो प्रत्येक अनुरोध के बीच कुछ मिनटों के विराम के साथ लगातार वेब अनुरोध भेजता है। यदि मैं UI थ्रेड में BeginGetResponse को कॉल करता हूं तो क्या यह मेरी समस्या का समाधान करेगा? – user1740959

+0

इसे * कॉल * के बाद भी क्या करना पड़ सकता है, क्या यह विधि कभी भी नहीं कहा जा रहा है, या आप कॉलबैक विधि और कोड को मारते हैं जो यूआई को कॉल को मार्शल करता है उसे कॉल नहीं किया जाता है? ऐसा लगता है कि आपके पास कुछ प्रकार का डेडलॉक चल रहा है। – 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();" आपके यूई धागे को अवरुद्ध करेगा।

लेकिन मुझे नहीं लगता कि 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