繁体   English   中英

Windows Phone 8-在Application_Closing方法中等待HttpWebRequest完成

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM