当前位置:编程学习 > C#/ASP.NET >>

C#的新特性体验(异步方法的同步调用)

异步编程出现已经很早了,微软在silverlight中的(RIA Service)将这个发挥到了极致,其实就是只提供异步远程服务调用,说起来也是非常美好的事情,但实际上却未必如此美好,因为很多应用,特别是带有业务性质的,都需要一定程度上的同步,在这种情况下如果用异步编程就会非常的复杂,需要用异步模拟同步,这个工作量是非常大的,特别是在业务逻辑比较复杂的情况下,需要调用一系列异步方法来组合,而调用在业务上要求有先后的情况下,就是一个灾难,非常复杂,而且代码的可读性和维护性极差(用silverlight做过企业应用的应该能体会那种痛苦),当然异步编程由于其处理方式比起同步编程来讲,对程序员的要求要高很多.微软显然是认识到了这个问题,于是在新的C#版本中弄出了async和await关键字,来简化异步下的同步模拟,下面的代码是我进行测试的代码(抄CSDN今天头条中异步编程中的):

[csharp]
private static async Task<string> GetContent(string url) 
        { 
            WebRequest wr = WebRequest.Create(url); 
            //var rsp = wr.GetResponse();  
            //var stm1 = rsp.GetResponseStream();  
 
            var response = await wr.GetResponseAsync(); 
            using (var stm = response.GetResponseStream()) 
            { 
                using (var reader = new StreamReader(stm)) 
                { 
                    //var content = reader.ReadToEnd();  
                    var content = await reader.ReadToEndAsync(); 
                    return content; 
                } 
            } 
        }  
private static async Task<string> GetContent(string url)
        {
            WebRequest wr = WebRequest.Create(url);
            //var rsp = wr.GetResponse();
            //var stm1 = rsp.GetResponseStream();

            var response = await wr.GetResponseAsync();
            using (var stm = response.GetResponseStream())
            {
                using (var reader = new StreamReader(stm))
                {
                    //var content = reader.ReadToEnd();
                    var content = await reader.ReadToEndAsync();
                    return content;
                }
            }
        }
UI线程下调用代码如下:

[csharp]
var theRet = GetContent("http://www.zzzyk.com/kf/201203/125486.html "); 
            MessageBox.Show(theRet.Result); 
var theRet = GetContent("http://www.zzzyk.com/kf/201203/125486.html ");
            MessageBox.Show(theRet.Result);
       await关键字是表示等待后面异步调用可用,起到异步转同步的作用,调试时也确实在await语句时被挂起了,其实界面无法做任何事情,这就跟同步调用没什么区别了,至少效果上一样的,因此如果遇到这种需求,其实没必要采用这种异步转同步的方式处理,直接同步调用就OK.

        坦率的讲,上面的代码我没有调试到结果,我用同步的方法很快就得到了结果,而用上述方法,就在var response = await wr.GetResponseAsync();语句时假死了,等了很久也没有响应,所以就直接结束调式了,那位兄弟测试后可以得到结果的,麻烦告诉一下我,好找找原因.是我人品问题还是我的VS2011库有问题,或者其它.

       另外,CSDN的头条异步编程其实是个噱头,应该是C#5.0提供了异步方法同步调用的支持.

PS:异步编程还是需要的,但要看地方.什么事情做得太偏激都不好.

 

摘自  hawksoft
 
补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,