2012-05-21 119 views
1

我有這個代碼是爲了做一個異步調用,但它不是,請看看它,讓我知道哪裏出了問題。異步HttpWebRequest不起作用

try 
{ 
    byte[] bytes; 
    Stream objRequestStream = null; 
    bytes = System.Text.Encoding.ASCII.GetBytes(GetJSONforGetMenuDetails(Id, MenuIds)); 
    wReq = (HttpWebRequest)WebRequest.Create(new Uri("http://" + MobileWLCUrl + urlCreateCacheAPI)); 
    wReq.ContentLength = bytes.Length; 
    wReq.ContentType = "text/x-json"; 
    wReq.ServicePoint.Expect100Continue = false; 
    wReq.Method = "POST"; 
    objRequestStream = wReq.GetRequestStream(); 
    objRequestStream.Write(bytes, 0, bytes.Length); 
    objRequestStream.Close(); 
    wReq.BeginGetResponse(new AsyncCallback(FinishWebRequest), null); 
    //resp = WebAccess.GetWebClient().UploadString("http://" + MobileWLCUrl + urlCreateCacheAPI, GetJSONforGetMenuDetails(Id, MenuIds)); 
    //EngineException.CreateLog("Cache Created (for Menus: " + MenuIds + ") in API for LocationId: " + Id); 
} 
catch (Exception ex) { EngineException.HandleException(ex); } 

void FinishWebRequest(IAsyncResult result) 
{ 
    WebResponse wResp = wReq.EndGetResponse(result) as WebResponse; 
    StreamReader sr = new StreamReader(wResp.GetResponseStream()); 
    String res = sr.ReadToEnd(); 
    EngineException.CreateLog("Cache Created (for Menus: " + MenuIds + ") in API for LocationId: " + LocId); 
} 

哪裏出問題了?當我調試它時,它會等待電話繼續下去,但這不應該發生。

回答

0

BeginGetResponse被記錄爲包括同步部分:

的BeginGetResponse方法之前該方法變得需要一些同步設置任務給 完成(DNS解析,代理檢測,並且TCP套接字連接, 例如)異步。因此,不應在用戶界面(UI)線程 上調用此方法,因爲它可能需要一些時間(通常爲幾秒)。在webproxy腳本配置不正確的 環境中, 這可能需要60秒或更長時間。

除此之外,如果你調用FinishWebRequest(從技術上說,如果調用EndGetResponse的請求之前有時間來完成,EndGetResponse將阻止。

這是意料之中的,因爲EndGetResponse需要返回到你的對象,你可以從響應數據 - 但它怎麼可以返回這樣一個對象,如果請求尚未完成?

+0

那麼可以做些什麼:o – 1Mayur