2015-03-25 67 views
1

我的Windows Phone 8應用程序中有一個組件(我們稱之爲RequestSender),它包含請求隊列以及一個線程(讓我們稱之爲SenderThread) ,它讀取隊列(Dequeue上的塊),並使用HttpWebRequest發送請求。Windows Phone 8 - 等待HttpWebRequest在Application_Closing方法中完成

的HttpWebRequest的內SenderThread的方法是在模擬同步調用,像這樣的方式進行:

_requestWaitHandle.Reset(); 
IAsyncResult respResult = webReq.BeginGetResponse(GetResponseStreamCallback, null); 
_requestWaitHandle.Wait(); 
HttpWebResponse response = webReq.EndGetResponse(respResult) as HttpWebResponse; 

其回調方法在這裏所做的唯一的事情就是設置_requestWaitHandle(這是由ManualResetWaitHandleSlim方式)。

所有這些工作正常,除了情況,當我嘗試發送「再見」請求時,當用戶按下「返回」硬件按鈕後關閉應用程序。

我試圖簡單地在Application_Closing方法中排隊「再見」請求,然後在RequestSender上調用「Stop」。 Stop方法會通知它應該退出的線程(通過設置適當的標誌),然後在線程上調用Join()。

SenderThread應完成處理Web請求,檢查「停止」標誌,並退出。這就是理論。

實際上,「再見」請求被入隊,開始被處理,但HttpWebRequest只是停留在BeginGetResponse上,並且永遠不會退出。什麼可能造成這種情況?

在下面的問題的答案之一:Question about HttpWebRequest它聲明,「HttpWebRequest使用UI線程來處理請求,不要問我爲什麼。」。這是真的?我怎樣才能避免這種情況,並簡單地提出網絡請求?我是否需要爲此使用別的而不是HttpWebRequest?

+0

是的,情況就是如此。只有一種方法可以使用套接字。它真的需要嗎?你不能以某種方式修改應用程序,以便它可以在沒有這個的情況下工作? – yasen 2015-03-25 13:42:07

+0

我是否可以修改它取決於我的客戶端:)他的一個請求是應用程序在關閉時發送「再見」請求(我知道如果沒有連接等,它不會發送),但讓我們離開這個案例在這裏)。 我對套接字並不陌生,所以我可以設法做到這一點,但認真......沒有在.NET或其他可用軟件包中的任何組件,這將允許輕鬆地執行非請求中的http請求, UI線程?我的下一個猜測是嘗試使用WebClient或HttpClient而不是HttpWebRequest,並且我想知道他們是否都不使用HttpWebRequest ... – 2015-03-25 20:05:23

回答

0

我需要與您完全相同的東西,並且我測試了平臺中的所有內容,但只有套接字完成了工作。

如果你想嘗試你的運氣與套接字 - 這裏的what I used(只是刪除JSON相關的東西)。而且你還需要this library

用法是這樣的:

var http = new HttpSocketConnection(); 
var postBody = new HttpPostBodyBuilder.*Body(); 
// Here you set some parameters 
using (var bodyStream = postBody.PrepareData()) { 
    var req = new HttpMessage.Request(bodyStream, "POST"); 
    req.ContentLength = bodyStream.Length; 
    req.ContentType = postBody.GetContentType(); 

    // send request 
    var response = http.Send(url, req); 
} 

希望這有助於。 :)

P.S.代碼遠非完美,但它做到了我所需要的,而且你知道那句老話:「如果事情沒有中斷,不要修復它」。 :)