要開始使用,可能會將其標記爲以下線程的副本: 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()繼續。有人能幫我一些指導/建議嗎?
對不起,作爲詳細。謝謝!
爲什麼要阻止UI線程?強制Silverlight中的所有內容使用異步IO的關鍵是阻止您阻止UI線程。只是不要這樣做。反而思考 - 與平臺一起而不是與之搏鬥。 – 2012-07-16 16:14:01
感謝您的意見,@JonSkeet。 – 2012-07-16 16:54:17