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

原创 2012年03月27日 14:01:59

        异步编程出现已经很早了,微软在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:异步编程还是需要的,但要看地方.什么事情做得太偏激都不好.

版权声明:本文为博主原创文章,未经博主允许不得转载。

C# 委托的三种调用示例(同步调用 异步调用 异步回调)

首先,通过代码定义一个委托和下面三个示例将要调用的方法: 复制代码代码如下: public delegate int AddHandler(int a,int b);     public ...
  • u012546338
  • u012546338
  • 2017年03月29日 11:07
  • 550

C#(同步调用、异步调用、异步回调)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T...
  • wanlong360599336
  • wanlong360599336
  • 2013年04月10日 10:31
  • 9216

如何将同步调用转换成异步调用

同步/非同步本来是IO方面的概念,不过我们可以把函数乃至各种RPC理解成一种IO设备,这样就可以把这两个词扩展到函数调用领域了。同步的函数调用指的是当函数调用返回的时候,需要函数干的事已经完成。而异步...
  • runyon1982
  • runyon1982
  • 2015年10月10日 09:22
  • 1070

同步方法和异步方法的区别

同步方法和异步方法的区别 同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果 异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作 林sir提示:在异步方法...
  • Kingson_Wu
  • Kingson_Wu
  • 2013年06月14日 11:56
  • 2997

C#异步调用四大方法详解

C#异步调用四大方法是什么呢?C#异步调用四大方法的使用是如何进行的呢?让我们首先了解下什么时候用到C#异步调用: .NET Framework 允许您C#异步调用任何方法。定义与您需要调用的方...
  • bfboys
  • bfboys
  • 2016年10月05日 10:18
  • 1356

异步终极解决方案-用同步方式写异步代码

三个异步函数,如:function async1(param, callback){ setTimeout(function(){ callback(param+'->async1'); ...
  • wzs_xyz
  • wzs_xyz
  • 2016年11月09日 17:44
  • 963

C# 中HttpClient的使用中同步异步问题

项目中遇到了这样的问题: 第一次 :HttpResponseMessage response = await httpClient.PostAsync(url, null);发送了一个post异步请求...
  • u010613052
  • u010613052
  • 2017年05月29日 13:08
  • 2978

C#异步调用的好处和方法

我们要明确,为什么要进行异步回调?众所周知,普通方法运行,是单线程的,如果中途有大型操作(如:读取大文件,大批量操作数据库,网络传输等),都会导致方法阻塞,表现在界面上就是,程序卡或者死掉,界面元素不...
  • liujun198773
  • liujun198773
  • 2015年07月18日 11:46
  • 1148

C#多线程的异步委托/调用

C#异步调用(Asynchronou Delegate) C#异步调用获取结果方法:主要有三种,也可以说是四种(官方说四种,电子书说三种),官方在MSDN上已经有详细的说明: 链接 需要了...
  • yangbingzhou
  • yangbingzhou
  • 2016年05月16日 09:36
  • 319

C# 同步异步的区别

c#中同步操作和异步操作的区别:
  • u013050857
  • u013050857
  • 2014年11月18日 20:41
  • 1074
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#的新特性体验(异步方法的同步调用)
举报原因:
原因补充:

(最多只允许输入30个字)