我的Windows Phone 8应用程序中有一个组件(让它称之为RequestSender),它包含一个请求队列,以及一个Thread(让我们称之为SenderThread),它读取queue(Dequeue上的块),并使用HttpWebRequest发送请求。
SenderThread方法中的HttpWebRequest是以模拟同步调用的方式完成的,如下所示:
_requestWaitHandle.Reset();
IAsyncResult respResult = webReq.BeginGetResponse(GetResponseStreamCallback, null);
_requestWaitHandle.Wait();
HttpWebResponse response = webReq.EndGetResponse(respResult) as HttpWebResponse;
回调方法唯一能做的就是设置_requestWaitHandle(顺便说一下,这是一个ManualResetWaitHandleSlim)。
所有这一切都很好,除了情况,当我尝试发送"再见"在用户按下" Back"硬件按钮。
我试图简单地将“#34;再见"在Application_Closing方法中请求,然后调用"停止"在RequestSender上。 Stop方法将通知线程它应该退出(通过设置适当的标志),然后在线程上调用Join()。
SenderThread应该完成对Web请求的处理,检查"停止"标志,然后退出。这就是理论。
在实践中,"再见"请求被排队,开始处理,但HttpWebRequest只挂起在BeginGetResponse上,永远不会退出。可能导致这种情况的原因是什么?
在以下问题的其中一个答案中:Question about HttpWebRequest已声明," HttpWebRequest使用UI线程来处理请求,不要问我为什么。&#34} #34 ;.这是真的?我怎样才能避免这种情况并简单地提出网络请求?我是否需要使用除HttpWebRequest之外的其他内容?
答案 0 :(得分: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。代码远非完美,但它完成了我所需要的,而且你知道一句老话:“如果某些事情没有被破坏,就不要修复它”。 :)