zoukankan      html  css  js  c++  java
  • Windows Phone的异步模型

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

    抛砖引玉,大家积极讨论。
  • 相关阅读:
    非域账户如何连接SQL Server Analysis Service
    Ranet.UILibrary.OLAP
    给Silverlight项目Ranet.UILibrary.OLAP添加客户端调试功能
    编译及安装QCA类库
    关于软件生态环境
    Windows7中操作mysql数据库
    介绍自己
    VS2008技巧收集
    .NET开发不可错过的25款必备工具
    如何做搜索引擎优化(SEO)
  • 原文地址:https://www.cnblogs.com/icuit/p/2586167.html
Copyright © 2011-2022 走看看