![](/img/trans.png)
[英]Wait for HttpWebRequest.BeginGetResponse to finish in Windows Phone 7
[英]Windows Phone 8 - waiting for HttpWebRequest to finish in Application_Closing method
我在Windows Phone 8应用程序中有一个组件(我们将其称为RequestSender),其中包含一个请求队列,还有一个线程(我们将其称为SenderThread),该线程读取队列(出队时发生阻塞)并发送请求使用HttpWebRequest。
SenderThread方法中的HttpWebRequest以模拟同步调用的方式完成,如下所示:
_requestWaitHandle.Reset();
IAsyncResult respResult = webReq.BeginGetResponse(GetResponseStreamCallback, null);
_requestWaitHandle.Wait();
HttpWebResponse response = webReq.EndGetResponse(respResult) as HttpWebResponse;
回调方法在这里所做的唯一一件事就是设置_requestWaitHandle(顺便说一下,它是ManualResetWaitHandleSlim)。
除情况外,所有这些都工作正常,当用户按下“后退”硬件按钮后关闭应用程序时,我尝试发送“再见”请求时。
我试图在Application_Closing方法中简单地将“再见”请求放入队列,然后在RequestSender上调用“停止”。 Stop方法将向线程发出信号,通知它应该退出(通过设置适当的标志),然后在线程上调用Join()。
SenderThread应该完成对Web请求的处理,检查“停止”标志,然后简单地退出。 那是理论。
实际上,“再见”请求被排队,开始处理,但是HttpWebRequest只是挂在BeginGetResponse上而永不退出。 是什么原因造成的?
在以下问题的答案之一中: 关于HttpWebRequest的问题指出,“ HttpWebRequest使用UI线程处理请求,不要问我为什么。”。 这是真的? 如何避免这种情况,而只是提出Web请求? 我是否需要使用HttpWebRequest以外的其他东西?
我需要与您完全相同的东西,并且我测试了平台中的所有内容,但是只有套接字才能完成工作。
如果您想尝试使用套接字的运气-这就是我所使用的 (只需删除与JSON相关的内容)。 而且您还将需要此库 。
用法是这样的:
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);
}
希望这可以帮助。 :)
PS该代码远非完美,但它满足了我的需要,并且您知道那句老话:“如果某些内容没有损坏,请不要修复它”。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.