Soo*_*nts 5 .net c# windows-phone-7
我正在开发一个Windows Phone 7.1应用程序,并试图实现墓碑.
由于法律原因,我无法保存我的视图模型.我只保存加密的会话ID,可用于从远程服务器加载视图模型数据.
在恢复时,我需要验证会话ID,如果它已过期 - 我将用户带到我的应用程序的登录页面,如果它仍然正常,我从服务器重新加载视图模型数据.
问题是HttpWebRequest缺少阻塞API.此外,在内部页面.OnNavigatedTo方法去墓碑后,这里描述的方法永远阻止.
我通过展示自己的启动画面解决了这个问题.
但是,我宁愿完成那些RPC调用,同时系统提供的"Resuming ..."启动画面是可见的,即在我从page.OnNavigatedTo方法返回之前.
任何想法如何在内页时同步完成HTTP请求.OnNavigatedTo de-tombstoning之后?
更新:另一种选择是使用Reactive Extensions。
如果您使用的是 VS2010,您可以安装 AsyncCTP ,并且当您执行此操作时,会添加一个扩展方法来允许您等待响应。
static async Task<Stream> AsynchronousDownload(string url)
{
WebRequest request = WebRequest.Create(url);
WebResponse response = await request.GetResponseAsync();
return (response.GetResponseStream());
}
Run Code Online (Sandbox Code Playgroud)
然后:
更新:
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
var myResponse = await AsynchronousDownload("http://stackoverflow.com");
}
Run Code Online (Sandbox Code Playgroud)
或者
如果您使用的是 VS2012,您可以安装Microsoft.Bcl.Async库并执行与使用 AsyncCTP 相同的操作(await响应)。
或者
您可以在 Caliburn Micro 中实现类似于协程的东西。为此,您需要实现 IResult 接口。
public interface IResult
{
void Execute(ActionExecutionContext context);
event EventHandler<ResultCompletionEventArgs> Completed;
}
Run Code Online (Sandbox Code Playgroud)
一个可能的实现:
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 { };
}
Run Code Online (Sandbox Code Playgroud)
然后调用它:
var httpWebRequestResult = new HttpWebRequestResult("http://www.google.com");
yield return httpWebRequestResult;
var result = httpWebRequestResult.Result;
Run Code Online (Sandbox Code Playgroud)
这可能是从 CM 获取协程实现并单独使用它的示例。
| 归档时间: |
|
| 查看次数: |
1696 次 |
| 最近记录: |