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

标签: c#silverlight编程企业应用测试service
2880人阅读 评论(0) 收藏 举报
分类:

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

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线程下调用代码如下:

var theRet = GetContent("http://sd.csdn.net/a/20120326/313535.html");
            MessageBox.Show(theRet.Result);

       await关键字是表示等待后面异步调用可用,起到异步转同步的作用,调试时也确实在await语句时被挂起了,其实界面无法做任何事情,这就跟同步调用没什么区别了,至少效果上一样的,因此如果遇到这种需求,其实没必要采用这种异步转同步的方式处理,直接同步调用就OK.

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

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

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

2
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1691326次
    • 积分:23236
    • 等级:
    • 排名:第287名
    • 原创:606篇
    • 转载:14篇
    • 译文:0篇
    • 评论:526条
    博客专栏
    最新评论