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