本文共 3048 字,大约阅读时间需要 10 分钟。
为了不阻塞UI,在windows phone的多线程上完全去掉了同步的模型,全部使用异步模型来处理请求。
这样带来的好处是UI不会被卡死,能够一直响应用户的响应,将比较耗时的操作丢给后台线程处理,并且能避开线程同步的麻烦。但这样一来,写出来的代码也比较难看,还可能涉及到数据共享的问题。我相信如果你的应用涉及到HttpRequest的话那么一定会遇到我说的情况。欢迎大家一起讨论你的思路。以下是几种我常用的异步请求代码的模型1、使用匿名函数,有时候为了节约会使用lamda表达式2、事件模式,通过订阅请求完成事件3、Async CTP第一种方式的代码如下:private string Reqest() { string resultString = string.Empty; HttpWebRequest request = HttpWebRequest.CreateHttp("http://www.google.com"); request.Method = "GET"; request.BeginGetResponse((IAsyncResult result) => { HttpWebRequest webRequest = result.AsyncState as HttpWebRequest; HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(result); Stream streamResult = webResponse.GetResponseStream(); StreamReader reader = new StreamReader(streamResult); //获取的返回值 resultString = reader.ReadToEnd(); }, request); return resultString; }
public delegate void GetResultEventHandler(object sender, string e); public event GetResultEventHandler OnGetInfoCompleted; private void Reqest() { HttpWebRequest request = HttpWebRequest.CreateHttp("http://www.google.com"); request.Method = "GET"; request.BeginGetResponse(GetInfoCompleted, request); } protected void GetInfoCompleted(IAsyncResult asyncResult) { try { HttpWebRequest webRequest = asyncResult.AsyncState as HttpWebRequest; HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult); Stream streamResult = webResponse.GetResponseStream(); StreamReader reader = new StreamReader(streamResult); //获取的返回值 string resultString = reader.ReadToEnd(); if (OnGetInfoCompleted != null) { OnGetInfoCompleted(this, resultString); } } catch (WebException ex) { MessageBox.Show(ex.Message); } }
第三种方式的代码实现如下:
private async resultString Reqest() { HttpWebRequest request = HttpWebRequest.CreateHttp("http://www.google.com"); request.Method = "GET"; HttpWebResponse webResponse = await request.GetResponseAsync(); Stream streamResult = response.GetResponseStream(); StreamReader reader = new StreamReader(streamResult, new GB2312.GB2312Encoding()); string resultString = reader.ReadToEnd(); return resultString; }
转载地址:http://tolgb.baihongyu.com/