博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows Phone的异步模型
阅读量:2504 次
发布时间:2019-05-11

本文共 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;        }

 

因为有时候请求会有嵌套关系,比如在请求第二个数据之前,需要先请求第一个数据,所以用第一种方式会一直匿名很多层,让我觉得很不爽。
在没有async CTP for windows phone之前,我一直用第二种方式来写代码,因为这样逻辑比较清楚。只是事件的模型看起来也不完美,但这也算是比较常用的异步模型,用事件来传递参数。缺点是当逻辑需要阻塞线程的时候,却又阻塞不了。
我想这也是async框架出现的原因吧。
在windows8的开发中,async框架已成为正式版,也就是说已经完全支持了第三种异步模型,也就是以async,await为主导的模型。这样即可以让需要等待的代码阻塞着,又可以让UI线程保持通畅,并且代码的逻辑也能很清楚,又避开了线程同步的数据锁的麻烦。
算是在这件事情上现阶段较为完美的方案了。
抛砖引玉,大家积极讨论。

转载地址:http://tolgb.baihongyu.com/

你可能感兴趣的文章
面向对象设计原则实践:之五.迪米特原则,接口隔离原则
查看>>
FFmpeg命令行应用备忘录
查看>>
基于ffmpeg-0.10 SDK的音频重采样
查看>>
基于ffmpeg-4.0 SDK的音频重采样
查看>>
FFmpeg的音频处理详解
查看>>
基于FFmpeg-4.0 SDK的PCM编码成AAC
查看>>
使用speex对pcm,wav进行降噪处理
查看>>
ffmpeg 中av_rescale_rnd 的含义
查看>>
FFmpeg-4.0 的filter机制的架构与实现.之一 Filter原理
查看>>
FFmpeg-4.0 的filter机制的架构与实现.之二 结构体关系与定义
查看>>
FFmpeg-4.0 的filter机制的架构与实现.之三 Filter实现的源码分析
查看>>
详解Perl字符串比较和整数比较的区别
查看>>
Perl字符串处理函数大全
查看>>
畅谈Perl时间处理函数用法
查看>>
多进程编程:Perl与C进程间的消息队列通信
查看>>
Linux下查看文件和文件夹大小
查看>>
linux新建用户与权限修改
查看>>
Intel VTune分析结果中的名词释译
查看>>
VS2005调试技巧
查看>>
VS2008 快捷键大全
查看>>