Windows Phone的异步模型

本文探讨了Windows Phone应用开发中处理HttpRequest时采用的不同异步请求模型,包括使用匿名函数、事件模式及AsyncCTP等方法,分析了各自的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了不阻塞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线程保持通畅,并且代码的逻辑也能很清楚,又避开了线程同步的数据锁的麻烦。
算是在这件事情上现阶段较为完美的方案了。

抛砖引玉,大家积极讨论。
资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案例,它涵盖了硬件电路设计、软件编程以及数据处理等核心知识点。STC单片机凭借其低功耗、高性价比和丰富的I/O接口,在电子工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)和IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”和“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项和项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离子电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全和寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟数字转换器)将模拟电压信号转换为数字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量和数据结构定义。处理电压数据时,可能涉及浮点数运算,需要了解STC单片机对浮点数的支持情况,以及如何高效地存储和显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值