2012-07-16 72 views
1

要開始使用,可能會將其標記爲以下線程的副本: Wait for HttpWebRequest.BeginGetResponse to finish in Windows Phone 7,但是該線程中的響應並未幫助我解決我的問題。ManualResetEvent with WP7上的HttpWebRequest

首先,我收集關於UI線程的用戶數據,以便處理應用程序註冊,其中我也有ManualResetEvent的實例開始:

private static ManualResetEvent registrationEvent = new ManualResetEvent(false); 

我有另一個線程,其處理登記過程(並且包括HttpWebRequest.BeginGetResponse()和其對應的回調方法。)

Thread t = new Thread(() => RegistrationHandler.sendRegistrationData(url)); 
t.Start(); 

右鍵這個呼叫後,我阻止與一個呼叫的電流(UI)線程

registrationEvent.WaitOne(); 

//Process the response, update some UI elements and navigate to a different page. 
httpSessionCompleted(response); 

一旦線程處理註冊過程開始,我實例化HttpWebRequest並調用它的BeginGetResponse()方法。

try 
{ 
    HttpWebRequest request = HttpWebRequest.CreateHttp(url); 
    request.Method = "POST"; 
    request.ContentType = mimeType; 

    request.BeginGetResponse(new AsyncCallback(GetRequestCallback), request); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine("Exception caught in sendData(): {0}", ex.Message); 
} 

現在的問題是,回調方法(代碼如下)永遠不會被調用,應用程序只會凍結。也似乎沒有任何異常(S)拋出。

try 
{ 
    HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState; 

    if (request != null) 
    { 
     using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult)) 
       { 
        using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
        { 
         String result = reader.ReadToEnd(); 
         Globals.HostResponse = result; 
         //Signalling the calling thread to continue execution 
         RegistrationPage.RegistrationEvent.Set(); 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Exception caught in GetRequestCallback(): {0}", ex.Message); 
     } 

我希望我的應用程序在回調方法完成執行後從httpSessionCompleted()繼續。有人能幫我一些指導/建議嗎?

對不起,作爲詳細。謝謝!

+3

爲什麼要阻止UI線程?強制Silverlight中的所有內容使用異步IO的關鍵是阻止您阻止UI線程。只是不要這樣做。反而思考 - 與平臺一起而不是與之搏鬥。 – 2012-07-16 16:14:01

+0

感謝您的意見,@JonSkeet。 – 2012-07-16 16:54:17

回答