我正在开发Windows Phone 7.1应用程序,并试图实现墓碑化。
由于法律原因,我无法保存我的视图模型。我只保存加密的会话ID,可用于从远程服务器加载视图模型数据。
在恢复时,我需要验证会话ID,如果它已过期 - 我将用户带到我的应用程序的登录页面,如果它仍然正常,我会从服务器重新加载视图模型数据。
问题是HttpWebRequest缺少阻塞API。此外,在内部page.OnNavigatedTo方法去逻辑删除后,方法described here永远阻止。
我通过展示自己的启动画面解决了这个问题。
但是,我宁愿完成那些RPC调用,同时系统提供的“Resuming ...”启动画面是可见的,即在我从page.OnNavigatedTo方法返回之前。
任何想法如何在内部页面内同步完成HTTP请求。在去墓碑之后导航到了什么?
答案 0 :(得分:0)
更新:另一种选择是使用Reactive Extensions。
如果您使用的是VS2010,则可以安装AsyncCTP,当您执行扩展时,会添加一个允许您等待响应的方法。
static async Task<Stream> AsynchronousDownload(string url)
{
WebRequest request = WebRequest.Create(url);
WebResponse response = await request.GetResponseAsync();
return (response.GetResponseStream());
}
然后:
更新:
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
var myResponse = await AsynchronousDownload("http://stackoverflow.com");
}
或
如果您使用的是VS2012,则可以安装Microsoft.Bcl.Async lib并执行与使用AsyncCTP相同的操作,await
响应。
或
您可以在Caliburn Micro中实现与Coroutines类似的功能。为此,您实现了IResult接口。
public interface IResult
{
void Execute(ActionExecutionContext context);
event EventHandler<ResultCompletionEventArgs> Completed;
}
可能的实施:
public class HttpWebRequestResult : IResult
{
public HttpWebRequest HttpWebRequest { get; set; }
public string Result { get; set; }
public HttpWebRequestResult(string url)
{
HttpWebRequest = (HttpWebRequest) HttpWebRequest.Create(url);
}
public void Execute (ActionExecutionContext context)
{
HttpWebRequest.BeginGetResponse (Callback, HttpWebRequest);
}
public void Callback (IAsyncResult asyncResult)
{
var httpWebRequest = (HttpWebRequest)asyncResult.AsyncState;
var httpWebResponse = (HttpWebResponse) httpWebRequest.EndGetResponse(asyncResult);
using (var reader = new StreamReader(httpWebResponse.GetResponseStream()))
Result = reader.ReadToEnd();
Completed (this, new ResultCompletionEventArgs ());
}
public event EventHandler<ResultCompletionEventArgs> Completed = delegate { };
}
然后调用它:
var httpWebRequestResult = new HttpWebRequestResult("http://www.google.com");
yield return httpWebRequestResult;
var result = httpWebRequestResult.Result;
This可能是从CM获取Coroutines实现并单独使用它的示例。
答案 1 :(得分:0)
首先让我说微软真的试图推动你做异步调用有充分的理由,这就是为什么我要强调它。
现在,如果你真的想要同步,我有一个我无法测试自己的想法。使用HttpWebRequest课程时,您可能会使用两个重要的功能:BeginGetResponse和EndGetResponse。
这两个功能紧密结合在一起。 BeginGetResponse
启动异步webrequest,当请求完成时,EndGetResponse
会在完成后提供输出。这是MS尝试让你这样做的方式。同步执行此操作的诀窍是beginGetResponse
返回IAsyncResult。此IAsyncResult
接口包含WaitHandler,可用于同步等待请求完成。之后,您可以继续使用endGetRequest并继续您的业务。同样适用于BeginGetRequestStream和EndGetRequestStream。
但正如我之前所说,我没有测试过这个解决方案,而且这纯粹是理论上的。让我知道它是否有效。
祝你好运!