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

时间:2015-03-25 12:59:31

标签: c# windows-phone-8 httpwebrequest

我的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之外的其他内容?

1 个答案:

答案 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。代码远非完美,但它完成了我所需要的,而且你知道一句老话:“如果某些事情没有被破坏,就不要修复它”。 :)