Hello World
Spiga

PDC 2010:C#与Visual Basic的未来(中)

2010-10-31 13:49 by 老赵, 3518 visits

前几天在PDC 2010会议上Anders Hejlsberg发表了一场名为“The Future of C# and Visual Basic”的演说,谈论了未来C#和VB中最为重要的两个特性:“异步(Async)”及“编译器即服务(Compiler as a Service)”。我现在对这场演讲进行总结,但不会像上次《编程语言的发展趋势及未来方向》那样逐句翻译,而是以Anders的角度使用一种简捷合适的方式表述其完整内容。上一篇Anders讲述了async和await的使用方式,而这篇则是对这两个关键字的实现及效果作更进一步的解释。

异步方法的目标,是为了让代码与同步方法保持一致。微软要让代码充斥着回调函数,混乱不堪,它们完全不是逻辑上你想做的事情。可能您的代码中包含着一个核心模型,你也已经实现了,只是您现在想把它的执行过程变得异步化。您自己就可以享受到这一点。

与我们之前做的一些扩展一样,工作分为语言和框架两部分。语言的异步功能基于框架中的Task<T>,我们会围绕着Task<T>扩展框架,将它作为异步模型的核心。事实上,从Begin/End,或是基于事件的异步模型进行扩展往往只需要一两行封装的代码,于是您也可以得到自己的Task<T>模型。

而在语言方面,我们添加了两个新的关键字。一个是async关键字,用于把方法标记为异步。还有一个是await方法,用于等待异步工作完成,或者说是把控制权交换给调用方继续执行其他工作。这两个功能在C#和VB种均有体现。

那么什么是Task<T>呢?它表现的是一个“后续会继续进行的操作”,这可以是许多东西,Task<T>并不做任何限制,例如是一个异步I/O,后台工作线程等等,甚至可以是UI上的一个按钮,在用户点击之后任务就结束了。

Task<T>的优势在于,它使用一个对象封装了整个概念,您可以查询其结果或是状态,或是这个任务所引发的异常。您可以用它来构造一个可组合的异步模型,这正式我们目前的异步编程模型所不足的地方。

此外,它还提供了一个可组合的回调模型,您可以对一个任务指定说,在它结束之后执行另外一段代码,然后还可以对这个新的任务继续进行设定。这便构造出一个完整的逻辑流,框架会自行帮你完成这些工作。事实上await操作符便会自动把您的逻辑改写成这样的代码,它将您从Lambda表达式及回调函数中的逻辑里解放了出来,一切都交给编译器去做了。您可能会有些疑惑,不过其实这些都是编译器所擅长的事情。

由于我们统一了异步模型,我们就可以在此之上构建组合工具。例如WhenAll,它接受一系列的Task对象,并在全部结束之后返回所有结果。还有WhenAny,则等待第一个完成的任务,返回其结果。我们还有Delay,可以等待一段时间,但不占用任何资源。

沿着这个过程走一遍可能就会清晰一些。这里有个例子,一个异步方法调用另一个异步方法。我们假设这是在UI线程上执行的,消息会一个一个发送至UI线程上。

好,有人调用了DoWorkAsync,于是出现了一些任务。

DoWorkAsync的第一件事,是调用了ProcessFeedAsync。

ProcessFeedAsync方法是一个异步方法,所以它做的第一件事是构造一个表示任务的Task对象。

然后它调用了DownloadFeedAsync,这会创建另一个Task对象。然后,我们遇上了await操作符,这意味着ProcessFeedAsync后面的部分,将作为DownloadFeedAsync完成后的回调函数/continuation里的工作。

于是任务返回至DoWorkAsync,我们得到了t1这个对象。

同样的过程会再次出现,是为t2。

然后便调用了Task.WhenAll,这会创建一个新任务,表示前两个任务全部完成。于是这里的await操作符表示接下去的代码会在前两个任务完成后再继续下去。此时控制权便还给了DoWorkAsync的调用者,不会对线程造成负担。

在未来某一时刻t1和t2会执行完,我们假设t2先结束。此时它会说:我完成了,执行回调函数/continuation吧。

于是它会和发起线程的SynchronizationContext交互,给UI线程发一个消息,让后续任务在UI线程上继续执行──您的代码不用关注这些。现在代码运行至SaveDocAsync上了,这是另外一个异步任务。await让代码在这里返回,线程又可以执行目前还未结束的任务了。

于是SaveDocAsync任务完成了,UI线程又获得了一个消息执行后续工作。

此时任务便到达了ProcessFeedAsync的末尾,于是t2任务结束了。

继续等待,上面的过程会再次出现,最终t1也结束了。

当t1和t2完成以后,最后DoWorkAsync任务也终于结束了。可以看到,我们逻辑流程,无论是循环还是异常捕获都是同步的,但是其中的执行过程完全是异步的。

但是这又是如何实现的?我不会在这里说太细,这又是个完整的话题了。这里有一个例子,是一个异步方法,它会调用并await另一个异步方法。

而编译器则最终则生成类似于这样的代码。我只会提几点,首先,这是个状态机,编译器构造的其实就是个状态机,例如迭代器就是个状态机,事实上这里编译器的工作和yield之余迭代器的重写本质上没有太大区别。

其次就是关于任务的执行和等待,假如在等待时任务已经完成了,那么其实您是在同步地执行后续代码。我们没有必要交还控制,反正已经完成了,我们不妨就直接进行下去了。await有自己的模式,会决定这一任务是同步还是异步地执行。对于同步执行的任务,一切就继续执行下去了,直到某个需要异步执行的地方,便把控制权交还给调用方。

那么我们再来看一下异步之于Web服务的意义。这里有个ASP.NET页面,它会向数据库里获取许多RSS地址,然后下载到本地并解析:

private void ProcessData()
{
    // ...

    var urls = new List<string>();
    using (var conn = new SqlConnection(connectionString))
    {
        conn.Open();
        var cmd = new SqlCommand("GetUserFeeds", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@UserID", user);
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read()) urls.Add(reader["FeedURL"].ToString());
        }
    }

    var feeds = (from url in urls select CreateWebClient().DownloadString(url)).ToArray();

    // ...
}

这里用到了DownloadString这个同步下载数据的方法。执行下来大约要花费1秒多的时间。这里我不再演示令人痛苦的异步写法了,你必须在Page_Load和Page_PreRender各写一些逻辑,注册一些异步工作,或者就要启用一些后台线程,但这又会影响后台的线程池,对系统的表现会带来影响。

现在我来演示一些简单的异步化工作:

private async void ProcessData()
{
    // ...

    var urls = new List<string>();
    using (var conn = new SqlConnection(connectionString))
    {
        conn.Open();
        var cmd = new SqlCommand("GetUserFeeds", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@UserID", user);
        using (var reader = await cmd.ExecuteReaderAsync())
        {
            while (reader.Read()) urls.Add(reader["FeedURL"].ToString());
        }
    }

    var feeds = await TaskEx.WhenAll(
        from url in urls select CreateWebClient().DownloadStringTaskAsync(url));

    // ...
}

我们将DownloadString修改为DownloadStringTaskAsync,这样LINQ返回的就是一系列表示下载任务的Task对象,然后使用await及WhenAll等待它们全部完成。数据库查询也可以如此。这就是所有我们要做的事情。如今页面的执行效率有了很明显的提高。使用这个做法,我们可以很轻松地提高Web系统的伸缩能力。如今我们需要调用很多互相独立的服务的情况越来越多了,异步方法对此有很大帮助。

如今的异步场景有许多种,例如在后台执行一个计算任务,这是基于CPU的异步,还有基于网络或I/O的异步任务。这些都能用Task来表示出来,因为Task表示的就是未来会完成的异步任务。此外,有了async和.NET框架,我们则出现了另外一种任务,既基于某些任务组合而成的异步任务。这也就是async方法所体现出的异步任务,它可以让你使用传统的语句来构造异步执行过程。

例如有这么一个场景:获取链接,根据链接下载Youtube视频,根据下载到的视频创建mashup并组合起来。在执行这些工作的时候,我们也希望UI可以响应用户操作。

而要完成这些工作,代码可能只需要这么简单,完全就像同步代码一样。而这里也体现了多种异步任务:ScrapeYoutubeAsync是网络密集型任务,然后同时下载两个视频并等待它们结束。然后MashupVideosAsync是CPU密集型任务,然后最后则是I/O密集型的的SaveAsync操作。对于异常处理来说,我们可以简捷地使用一个try...catch,就像传统编程那样。

总结一下,一个异步方法可以让代码和同步实现一样简单,并统一了计算、网络及I/O的异步化。这可以用来创建高度伸缩的服务器程序,自然还有响应度高的UI程序。

在演讲的末尾,我会给出Visual Studio Async CTP的下载链接,我很乐于得到大家的反馈。

相关文章

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

78 条回复

  1. niok
    183.14.248.*
    链接

    niok 2010-10-31 15:28:31

    这不跟F#的特性重合了么?纠结啊

  2. 老赵
    admin
    链接

    老赵 2010-10-31 15:37:57

    @niok

    虽然原理不同,但的确是为了相同的目的的。不过要说起来,C#和VB重合度不更高吗?怎么没有人有这方面困扰呢?没人说过出了一个F#就必须精通,就像没人说有精通C#后还得精通VB。

  3. Duron800
    117.79.83.*
    链接

    Duron800 2010-10-31 15:58:38

    下周跟进老赵的这个系列。

  4. niok
    183.14.248.*
    链接

    niok 2010-10-31 16:11:36

    @老赵

    有道理。用F#写了一两周程序了,还不顺手,主要是思维一时难以转变,老赵在这方面花了多长时间才写得顺手的呢?C#在异步这方面的语言特性是不是要在下个版本才会正式发布呢?

  5. 老赵
    admin
    链接

    老赵 2010-10-31 16:28:58

    @niok

    我大学里接触过函数式编程,所以F#用起来比较容易的。

    C#的下一版本,估计至少也要在2012年后半段出来了吧,之前也会有较多修改,就像当时作dynamic的时候,在使用模式上也是权衡了好多遍。

  6. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-11-01 00:24:51

    1、如果你已经掌握了在哪里使用async,await,其实你写传统的多线程、多进程程序已经没有障碍了。初学者写不好多线程,关键是概念不清楚,而一开始就用这个,对今后的发展是不利的。

    2、其实微软这套方法并不比libevent之类的高多少,但是又使用了微软的一贯的高度封装风格,导致初学者很难理解实际流程。

    3、微软和老赵又画了一张大饼:“高度伸缩的服务器程序,自然还有响应度高的UI程序。”

    问题是这个改进是语法改进,并不是实质改进。没有这个原来.net就应该有“高度伸缩的服务器程序,自然还有响应度高的UI程序。”,问题是我没看到有一个.net“高度伸缩的服务器程序”框架,绝大部分都是C语言写的,还有一部分是java的,而ui程序即使不用密集计算的,响应度也不高。难道说飞信、evernote过去是因为没有这个特性导致用户响应度不高吗?

  7. tinytian
    222.66.163.*
    链接

    tinytian 2010-11-01 01:34:35

    怎么又见楼上这种人啊!

  8. 链接

    sinsaychen 2010-11-01 01:34:57

    本来想驳一下LS的,结果想了一想...确实还真是那么一回事儿...

  9. 老赵
    admin
    链接

    老赵 2010-11-01 01:55:37

    @mcpssx

    .NET没有可高度伸缩的服务器程序,没有响应度高的UI?说到底你还是没有搞清楚现在这里在谈什么东西就来扯东扯西的,根本连这里的“响应度”和“伸缩性”是指什么都没理解,看到几个名词就用自己的理解去乱套,根本和以前说“兼容性”的时候一点长进都没有么。

    每次一说起来你就没边,以前说的够多了,只是浪费时间。对旁观者来说,除了被你些名词唬住,屁个长进都没有。看上去你了解很多,让你好好写点什么好交流交流,你又不愿意。实在懒得应对了。

  10. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-11-01 02:01:27

    那你给我举个例子看,.net的“可高度伸缩的服务器程序”或者框架在哪里?

    用c的,有apache,ngnix,用框架有libevent,libev 而.net的有什么类似产品?

    而响应度高的UI?很明显,飞信就是因为这个原因不用.net了,evernote从3.0开始改用wpf,结果响应完全跟不上,从4.0开始又改用原来的c++框架了。

  11. 九拍
    210.13.83.*
    链接

    九拍 2010-11-01 02:02:52

    lz可以考虑搞个图床,现在点击看大图,比较不给力。

  12. 老赵
    admin
    链接

    老赵 2010-11-01 02:32:19

    @mcpssx

    高度可伸缩性的应用程序主要是指ASP.NET,例子太多了我就不列举了。你看过文章了么?知道文章里在说什么吗?代码都在放在那里,你还在扯。至于libevent什么的,虽然可能没有通用的,但是WCF本身的Service Host(不是IIS Host)就是能力的明证。

    飞信之类的不用WPF,遇到的问题不一定是响应能力,不是所有的性能问题都是响应能力,OK?不过,我也强烈怀疑它的问题是没有用好异步IO,而是使用后台线程在同步地搞,现在正是解决这个问题的时候。还是那句话,你看过文章了么?知道文章里在说什么吗?

  13. 老赵
    admin
    链接

    老赵 2010-11-01 02:38:08

    @九拍

    没办法,VPS,性能不高啊。图片还是自己统一管理的好。

  14. ming
    61.174.24.*
    链接

    ming 2010-11-01 02:43:10

    总算看完了,这个改进相当爽啊~ 如果用过这个再去用传统的异步,感觉肯定会相当痛苦

  15. abc
    61.135.195.*
    链接

    abc 2010-11-01 03:05:57

    这种高度抽象的封装对设计框架的人的要求很高。

    在设计调试的环节不能出现一丁点底层的东西,也就是说不能有抽象泄露。

    举个例子,如果某句代码有一个底层错误需要处理,可能就很麻烦了。这个机制如果结合STM就更完美了。

    这个我要再写点东西,先mark。

  16. 链接

    小城故事 2010-11-01 03:08:44

    请教一下老赵,你文章里的代码块是怎么嵌入的,和VS里看到的一样呢

  17. 老赵
    admin
    链接

    老赵 2010-11-01 03:16:57

    @小城故事

    Windows Live Writer有个插件叫做Paste from Visual Studio,这也是我时不时用个Windows虚拟机最主要的原因了。

  18. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-11-01 04:38:46

    高度可伸缩性的应用程序主要是指ASP.NET,例子太多了我就不列举了。你看过文章了么?知道文章里在说什么吗?代码都在放在那里,你还在扯。至于libevent什么的,虽然可能没有通用的,但是WCF本身的Service Host(不是IIS Host)就是能力的明证。

    和我说的完全不失一码事,我举的例子是apache,ngnix,libevent而不是各种cgi语言,asp.net自己怎么伸缩?调度分配是iis的功能吧?

    .net目前连一个类似tomcat的东西都很那找。

    飞信之类的不用WPF,遇到的问题不一定是响应能力,不是所有的性能问题都是响应能力,OK?不过,我也强烈怀疑它的问题是没有用好异步IO,而是使用后台线程在同步地搞,现在正是解决这个问题的时候。还是那句话,你看过文章了么?知道文章里在说什么吗?

    这个怀疑完全没有道理,飞信、evernote换成C++以后,就改为使用了异步IO了?归根接低,是.net自己的速度有问题。

    请看这里:

    Evernote Windows v4 放弃了自V3.0开始采用的 .Net 平台,转向了效率更高的 Native C++ 平台。这是v4版本之所以能在性能方面大幅提升的关键所在。

    如果说Evernote先前几次重大变化是主动的,则这次转变只能说在 .Net 平台始终达不到性能要求后的应对之举。但是,无论主动还是被动,Evernote勇于大幅度更新、创新的做法,都令人印象深刻。

    为什么Evernote Windows v4 要从.Net转向Native C++,开发人员给出3条原因:

    1. .NET WPF存在严重的硬件兼性问题,而MS不能及时解决。
    2. .Net过高的CPU和内存占用,与Evernote定位于提高效率的概念不符。
    3. 大量优秀而高效的程序表明,Native C++ 是更可靠的平台。

    但笔者以为,核心因素仍然是第2条:即.Net 的“低效”与 Evernote 定位的“高效”背道而弛。

  19. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-11-01 04:50:52

    老赵说到了WCF,我也提个看法,这玩意又是一个微软推出的不保证未来前途的高度封装的独有技术,一如过去的.net remoting之类的,无法保证前途,很可能又被丢弃。

    初学者还是老老实实从socket学起,

    比这容易的多,可靠的多,也有前途和钱途的多。

  20. 老赵
    admin
    链接

    老赵 2010-11-01 05:33:19

    @mcpssx: 和我说的完全不是一码事,我举的例子是apache,ngnix,libevent而不是各种cgi语言,asp.net自己怎么伸缩?调度分配是iis的功能吧?

    我自然是跟你说的完全不是一码事,我之前就指出了,我说的是我文章里的事情,而你说的是我文章外的事情。我从一开始就说了,你没有看文章就在扯你自己的,现在你也意识到了么?

    对于服务器程序来说,性能的瓶颈都是后台程序上,几乎不会是Web服务器。作为Web服务器,IIS的性能和伸缩性很好的,远超Apache,尤其是基于IOCP的服务器端,只要ASP.NET能够利用这方面的能力,就能在伸缩性和性能方面更进一步。以前写异步程序麻烦,现在写异步程序简单,这就是nb的地方。当ASP.NET性能越来越接近IIS的能力,这不就是伸缩性的提升么?

    Evernote方面的问题我就不清楚了,你转载的内容完全是某个媒体在猜测。我做过很多实验,你说C++性能高,我不否认,但.NET不会差那么多。如果有文章里那么大的差别,我有充足理由相信这是程序上经过了优化,比如新的C++版本用了异步IO,为什么不可能?

    你引用的文章里也提到:内存使用V3.5为150+MB,V4降至20+MB。我很难相信这是没有做过程序优化的结果。我相信之前的实现也有问题,因为我目前打开的VS2010也就200+MB大小,其中还开了几十个文档,没打开时也就150M左右。而且,如果你说.NET性能不行,Paint.NET的新版也已经基于.NET 4了。你觉得它的性能如何?基于.NET的程序我天天用,一点不夸张。

    还有WCF什么高度封装——我了解过一点点WCF,你说的还真值得商榷,而且难道Mina,Netty这种就没意义了吗?我始终不理解你为什么厌恶框架,记得你连Rails都不喜欢,我倒觉得这是你自己的倾向而已,我不同意。你说学Socket,你要写一个应用、服务对外发布,不用框架用Socket,这不是坑人么。

  21. doylecnn
    222.68.249.*
    链接

    doylecnn 2010-11-01 08:23:20

    @mcpssx

    自己懒,长了腿不愿意直立起来解放双手

    还要到处叫,说只用两只脚走路,速度慢,解放出来的两只手多余,直立起来保持平衡浪费运算

    毕竟四足走路到二足走路解决的不是实质问题

    毕竟实质的问题要等到由于有足够多的需求需要二足走路后,生理方面进化到合适二足走路

    不过,没关系,四足走路的会继续进化到,比如出现地面最快的豹子

  22. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-11-01 09:33:20

    对于服务器程序来说,性能的瓶颈都是后台程序上,几乎不会是Web服务器。作为Web服务器,IIS的性能和伸缩性很好的,远超Apache,尤其是基于IOCP的服务器端,只要ASP.NET能够利用这方面的能力,就能在伸缩性和性能方面更进一步。以前写异步程序麻烦,现在写异步程序简单,这就是 nb的地方。当ASP.NET性能越来越接近IIS的能力,这不就是伸缩性的提升么?

    再nb跟asp .net一点关系没有,apache再牛逼跟php的实现有什么关系吗?

    我先不说你iis远超apache是否正确,总之iis是C++写的。asp.net只负责解析页面而已。

    Evernote方面的问题我就不清楚了,你转载的内容完全是某个媒体在猜测。我做过很多实验,你说C++性能高,我不否认,但.NET不会差那么多。如果有文章里那么大的差别,我有充足理由相信这是程序上经过了优化,比如新的C++版本用了异步IO,为什么不可能?

    evernote是著名的知识管理软件

    异步io当然不可能了,因为evernote2.0就是用C++写的,3.0改为.net后性能大幅下降,4.0改回来就是恢复到了原来2.0的响应水平。

    你引用的文章里也提到:内存使用V3.5为150+MB,V4降至20+MB。我很难相信这是没有做过程序优化的结果。我相信之前的实现也有问题,因为我目前打开的VS2010也就200+MB大小,其中还开了几十个文档,没打开时也就150M左右。而且,如果你说.NET性能不行,Paint.NET的新版也已经基于.NET 4了。你觉得它的性能如何?基于.NET的程序我天天用,一点不夸张。

    因为evernote 2.0本来就是C++的,之前速度很快的,换成wpf后性能一落千丈。

    其实写C++的客户端程序,一般软件很少有谁去研究优化性能的。

    还有WCF什么高度封装——我了解过一点点WCF,你说的还真值得商榷,而且难道Mina,Netty这种就没意义了吗?我始终不理解你为什么厌恶框架,记得你连Rails都不喜欢,我倒觉得这是你自己的倾向而已,我不同意。你说学Socket,你要写一个应用、服务对外发布,不用框架用 Socket,这不是坑人么。

    我并不是说厌恶框架,libevent也是框架,我反对的是微软这种高度封装,未来不明的框架。

    wcf有两个问题,第一性能如何?你能说的清?第二,未来如何?过几天被废了的可能性,我看不小。

  23. 链接

    陈梓瀚(vczh) 2010-11-01 09:39:00

    因为有了容易的工具就放弃深入学习原理的人,怪谁啊,微软又不是大学,干嘛非得保证你们人人都精通原理,能保证你们都完成得了公司给的任务已经很不错了。

  24. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-11-01 09:44:27

    @doylecnn

    所以我就是请认为自己不懒的,很爱学习的的.neter们展现出一个个“跑得很快的豹子”来

    比如说从开发上讲wcf是否能与mina, libevent之类抗衡,从应用上讲,有没有与wordpress,discuz抗衡的产品?

    我一直说,.net总在写helloworld, 而没有产品,.net写了10年的很好的hello,world,会用.net remotion, wcf等等四种方式写远程调用,而php们就会一点sql, js和脚本语言。.net们跟着微软埋头学习拉车,结果最后一无所获。

    最近silverlight未来不知道如何,但是iron系列显然又快完了。当然了,老赵会说iron交给社区了,不过微软的社区跟开源的社区行动力可不一样。

  25. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-11-01 09:51:33

    evernote的问题并不是媒体猜测,这三个原因是evernote的开发人员指出的

    1. .NET WPF存在严重的硬件兼性问题,而MS不能及时解决。
    2. .Net过高的CPU和内存占用,与Evernote定位于提高效率的概念不符。
    3. 大量优秀而高效的程序表明,Native C++ 是更可靠的平台。

    还有一个例子,就是纽约时报,从2006开始使用wpf,到2009年抛弃了wpf改用adobe。

    这绝对不是用异步,优化能解释的。

  26. 老赵
    admin
    链接

    老赵 2010-11-01 11:23:13

    @mcpssx

    ASP.NET应用程序伸缩性的瓶颈在于IIS的伸缩性,因此让ASP.NET有能力轻松地达到IIS的伸缩性,就是提高ASP.NET的性能,我说的那么清楚了你还不明白?说到ASP.NET应用程序的性能,我可以举出太多太多的成功案例,StackOverflow不能和WordPress,Discuz抗衡?只不过没开源而已。还有大量中端就不说了,ASP.NET在企业里面用的太多了。

    可惜我说了再多,你都是一个观点:不认可,回避。还让WCF和Mina比开发,WCF很快可以搞出个服务的时候,用Mina的还不知道在做什么呢。我觉得吧,你还不如直接说“微软技术就是糟糕”更能表现出你的观点。

    写C++程序不需要性能优化?那我能不能说,写C++花费的成本,比.NET程序写好加优化还要多。你举Evernote,纽约时报的例子,我就可以举VS,Expression,Paint.NET。你说用相同的技术,有的人能做好,有的人做不好,你的结论是什么?你对微软技术持有敌意,只盯着失败案例,这种选择性无视实在没意思。而且,如果你能给出实际数据倒也罢,你一直在推断,那么我也可以推断,推断一两次也罢,你持续推断下去,毫无意义。

    还有Silverlight,Iron系列,WCF被废弃,微软社区云云,一贯地FUD,还有割裂微软与开源社区的手法,见怪不怪了,不予评价。我花费的精力,和你不做调查随口推断相比,实在太浪费了。

  27. mathgl
    222.216.162.*
    链接

    mathgl 2010-11-01 11:37:35

    我现在构建的 real-time gps vehicle tracking system的server就是基于 iocp和 .net 4.0 的tpl。一台普通的电脑可以管理上万的长连接,响应度也不错。

    同样的程序略加改动可以使用mono在linux下跑。当然这不是什么热门的东西,不能和tomcat之类的比较了。

  28. mcpssx
    58.19.85.*
    链接

    mcpssx 2010-11-01 12:04:59

    @老赵

    ASP.NET应用程序伸缩性的瓶颈在于IIS的伸缩性,因此让ASP.NET有能力轻松地达到IIS的伸缩性,就是提高ASP.NET的性能,我说的那么清楚了你还不明白?说到ASP.NET应用程序的性能,我可以举出太多太多的成功案例,StackOverflow不能和WordPress,Discuz抗衡?只不过没开源而已。还有大量中端就不说了,ASP.NET在企业里面用的太多了。

    我不是问你asp在iis上的伸缩性,我是问你有没有用.net写的高性能框架?你说了半天在企业中用得太多了,统统都是说C++ iis的能力。

    这与.net本身的能力有什么关系?我是问,.net能不能写出个libevent之类的性能的产品?

    我就可以举VS,Expression,Paint.NET。你说用相同的技术,有的人能做好,有的人做不好,你的结论是什么?你对微软技术持有敌意,只盯着失败案例,这种选择性无视实在没意思。而且,如果你能给出实际数据倒也罢,你一直在推断,那么我也可以推断,推断一两次也罢,你持续推断下去,毫无意义。

    1. Paint.net有多少人在用?有没有经过最终用户的考验?装vs的程序员的机器的内存一般多大?是不是平均水平大于一般用户?borland的水平如何?当年能把纯java的jbuilder优化到native的C++ builder ide的水平不?

    2. 实际数据已经很清楚了,evernote、飞信、纽约时报都转回了C++,你觉得你或者说看你文章的人的优化水平是靠近他们呢?还是微软vs开发组?

  29. 老赵
    admin
    链接

    老赵 2010-11-01 12:34:58

    @mcpssx

    我最后说一遍:我不关心这个伸缩性是.NET带来的还是IIS带来的,但是现在的语言特性可以轻松的让ASP.NET应用程序提升一个档次,这就是“提升服务器应用程序”的工业意义。WCF性能白皮书表示性能比IIS上托管的甚至更好(毕竟IIS上要做更多事情),也是可以基于异步的。你说这些是不是.NET做的?

    如果你要说到底,你可以说这些性能都是操作系统带来的,Linux的伸缩性还不是靠在内核里加上epoll以后才提高的,这又关.NET什么事情,关Java什么事情?关C++什么事情?但这就没有意义了。其实ASP.NET就是.NET程序伸缩性的良好体现,如果.NET做不到,又怎么在IIS上体现出来?

    如果你再搞不明白,我也不再重复了。

    Paint.NET用的人太多,赞美之词也很多,你也不妨自己装一个试试看。不用猜测装VS的内存多大,我用Mac OSX,VS2010在1G的虚拟机上照样跑的流畅,在公司的Windows机器上,都是一开同时就3、4个,毫不夸张,你不用推测,我天天亲身经历。

    Evernote和纽约时报的问题我不知道,他们都没有开源,否则都可以看一下,现在从前后资源消耗对比上来看,我几乎可以肯定Evernote犯了什么错误。还有我基本确定飞信客户端写的有多糟糕,因为我想我的消息来源还是很可靠的。

  30. mcpssx
    58.19.85.*
    链接

    mcpssx 2010-11-01 13:06:22

    @老赵

    我最后说一遍:我不关心这个伸缩性是.NET带来的还是IIS带来的

    问题是因为你说的。net的async关键字带来的高伸缩性,我当然是要看.net的伸缩性能问题了,我又不是跟你讨论iis和apache的架构谁好。

    如果你要说到底,你可以说这些性能都是操作系统带来的,Linux的伸缩性还不是靠在内核里加上epoll以后才提高的,这又关.NET什么事情,关Java什么事情?关C++什么事情?但这就没有意义了。其实ASP.NET就是.NET程序伸缩性的良好体现,如果.NET做不到,又怎么在IIS上体现出来?

    不然,如果.net能做出来,那就出一个libevent .net来看看,.net也可以调用epoll,iocp吧?

    但是现在的语言特性可以轻松的让ASP.NET应用程序提升一个档次,这就是“提升服务器应用程序”的工业意义。WCF性能白皮书表示性能比IIS上托管的甚至更好(毕竟IIS上要做更多事情),也是可以基于异步的。你说这些是不是.NET做的?

    ok,微软出一个tomcat .net比iis性能好,我就信,光拿一个白皮书来,微软哪次换架构的时候,不是说“又提高了多少多少“。

    Paint.NET用的人太多,赞美之词也很多,你也不妨自己装一个试试看。不用猜测装VS的内存多大,我用Mac OSX,VS2010在1G的虚拟机上照样跑的流畅,在公司的Windows机器上,都是一开同时就3、4个,毫不夸张,你不用推测,我天天亲身经历。

    1. Paint .net这用得太多的人,恐怕大都也是程序员写了个图片处理的helloworld吧?我没看见哪些设计师用这个东西。
    2. 我记得以前c++ builder delphi6用64m内存就可以跑。
    3. 如果你用vs2010 内存搜索一下,可以看到很多抱怨。

    Evernote和纽约时报的问题我不知道,他们都没有开源,否则都可以看一下,现在从前后资源消耗对比上来看,我几乎可以肯定Evernote犯了什么错误。还有我基本确定飞信客户端写的有多糟糕,因为我想我的消息来源还是很可靠的。

    evernote犯了错误,那么纽约时报是微软亲自支持的,也优化不成功?飞信开发组用.net的时候很糟糕,现在用C++反而就成了高手?我想C++应该比C#要难用一点吧?C#用不好的人,现在用C++开发的客户端,客户满意度就提高了?

  31. icoxsm
    113.110.181.*
    链接

    icoxsm 2010-11-01 13:53:11

    客观的说,微软有很多技术是很好,但.net是靠钱和广告砸出来的,这个东西做客户端又大又慢,做服务端?不知道有什么知名网络框架是用.NET技术做的。

    VS2010我装了一天,就卸了,公司电脑2G内存,集成显卡,一卡一卡的。 家里4G内存,独立显卡,没公司那么卡,也没VS2008快,还是卸了。 什么时候用C++把 VS的界面重写一遍啊,像vc6一样。

    .NET做的客户端就是个杯剧。

  32. 老赵
    admin
    链接

    老赵 2010-11-01 14:11:06

    @mcpssx

    问题是因为你说的。net的async关键字带来的高伸缩性,我当然是要看.net的伸缩性能问题了,我又不是跟你讨论iis和apache的架构谁好。

    还是老话:只要async和await能提高.NET应用程序的伸缩性,不管它是怎么提高的,管它用的是谁的能力,它真提高了,就够了。也罢,看来你是真心听不懂我的话了,我不想再和你纠缠下去了。

    不然,如果.net能做出来,那就出一个libevent .net来看看,.net也可以调用epoll,iocp吧?

    .NET自然可以调用iocp,现在就是调用的,ASP.NET和WCF就享用的好好的。我不相信libevent.net做不到,但是没有需求,因此没人去作,WCF和ASP.NET的伸缩性已经很能说明问题了,只是你不愿意承认而已。

    微软出一个tomcat .net比iis性能好,我就信,光拿一个白皮书来,微软哪次换架构的时候,不是说“又提高了多少多少“。

    提高了多少是事实,是摆在眼前的数据,横向纵向比较你都可以做,不用关心谁给的,你不信可以自己做一遍。你愿意么?你承认么?我相信这个白皮书的结果,所以我没比较过。我比较过IIS和Apache,IIS的性能超过Apache一大截(IIS还用了很多.NET),你还是一样不承认。我很灰心和无奈,所以希望你可以比较一下。

    1. Paint .net这用得太多的人,恐怕大都也是程序员写了个图片处理的helloworld吧?我没看见哪些设计师用这个东西。
    2. 我记得以前c++ builder delphi6用64m内存就可以跑。
    3. 如果你用vs2010 内存搜索一下,可以看到很多抱怨。

    Paint.NET本来就不是给设计师用的,但是足够复杂,比飞信复杂地多,就足够说明问题了。不要拿当年的程序和现在的比,就光拿编辑器来说,功能复杂度上就不是个量级的。VS2010的问题我就奇怪了,我用下来感觉很好。

    纽约时报是微软亲自支持的,也优化不成功?飞信开发组用.net的时候很糟糕,现在用C++反而就成了高手?我想C++应该比C#要难用一点吧?C#用不好的人,现在用C++开发的客户端,客户满意度就提高了?

    有件事情我还想细问,纽约时报转成Adobe是因为性能问题,还是跨平台问题?还有,你居然会以为飞信开发组写C#和C++的人是同一批?

  33. 老赵
    admin
    链接

    老赵 2010-11-01 14:14:15

    @icoxsm

    .NET通用框架是不多,因为社区在这方面做的不够好。Code Snippet很多,大家都是做到表现个能力出来,就感觉OK了。不过.NET的应用相当多,性能也好,就够了。

    我公司的机器一直是2G内存,显卡没关心过,用VS2010很顺畅,一开还是3、4个项目,我已经忘了VS2008是什么感觉了。

  34. 老赵
    admin
    链接

    老赵 2010-11-01 14:20:32

    忽然想到:微软用微软技术做的好,别人用微软技术做不好,问题出在微软技术上。别人用逼人技术做得好,微软用别人技术做不好,问题还是出在微软公司身上。

    可怜的微软,我对于这种双重标准真心感到很无语。

  35. Eric
    27.36.158.*
    链接

    Eric 2010-11-01 14:20:58

    这年头真的什么人也有。讨论可以,有必要咬着不放?就算老赵真的被你洗脑了,反转枪头跟你一起天天骂.NET,又能怎样,用.NET依然继续用,不用.NET的依然不用,靠.NET数钱的开发公司继续数钱,靠在网上装下逼满足自己的高手梦的依然只能装下逼满足自己的高手梦。

  36. Eric
    27.36.158.*
    链接

    Eric 2010-11-01 14:25:35

    顺便说一下,国内主流的开发语言/平台:Java、PHP、.NET、C++通通都有人用得不爽,通通都被人骂过,但就是这些大家来找碴的技术养活了一大批公司和一大批人。

  37. 老赵
    admin
    链接

    老赵 2010-11-01 14:26:10

    @Eric

    只要说的靠谱,我倒觉得咬着不放没有任何关系。还有就是,不同意我说的也罢,但我最怕听不懂我在说什么,不断重复,重复……

  38. mcpssx
    58.19.85.*
    链接

    mcpssx 2010-11-01 15:17:08

    有件事情我还想细问,纽约时报转成Adobe是因为性能问题,还是跨平台问题?还有,你居然会以为飞信开发组写C#和C++的人是同一批?

    我记得老赵你一贯认为.net跨平台不是问题的,你经常说的就是mono如何,说跨平台有问题的是不愿意亲自尝试的。更何况Silverlight是微软官方支持跨平台的。

    飞信是不是同一批人,其实不是重要问题,因为C#是有GC的,而C++是没有的,C++更容易泄露内存,我记得微软当初还测试宣布C#分配内存比C++快多少,但是我们很容易发现,C++写得让大家感觉响应很慢的程序是很少的。

  39. 老赵
    admin
    链接

    老赵 2010-11-01 15:41:08

    @mcpssx

    看看我写的文章吧:

    同理,我中意mono,也不会强求它多么多么追求与MS .NET实现一致,我对它的期望只是个足够好的.NET运行环境就行了(当然也不能跨得太差了)。

    而且,我的文章里还写了:

    不同的平台,如Windows,Linux或是Mac,它们的桌面环境都有着非常明显的区别。而即便是XP和Vista,Gnome或KDE,再加上各个参数细节的定制,想要在单一平台上做出合适的界面都是不太容易的事情,更何况跨平台。

    所以我的观点一直是统一的:我说mono跨平台,是说它在服务器端,基本不用做什么修改,我什么时候说过它跨WPF程序了?不要把我没有说过的话拿出来说。这次我写了文章还算有个记录,否则你随口一说,好像我还真的莫名奇妙了。

    至于纽约时报的问题,请看这篇报道,可以看出问题是两点:一是WPF和Silverlight的代码难以复用,二是字体呈现上的奇怪表现,丝毫不关性能问题,也不是Silverlight跨平台能力的问题。

    因此,您又举了一个和性能无关的问题来说明性能差,和跨平台无关的问题来说明跨平台不好。要不是我这里稍微追究一下,不知道会不会有人又亲信了您的随口给出的“事实案例”。

    太没意思了。

  40. harry
    58.34.124.*
    链接

    harry 2010-11-01 15:49:14

    @icoxsm

    羡慕你还能成功卸载,以前装个vs2008,用了不久不知怎么坏了,后来卸载后,重装不了,折腾半天结果只能重装系统,嘿,能装了。

    前段时间在xp上装了个vs2010尝鲜,由于长期不用,今天想卸载,结果连着报错,一气之下找到相关文件直接删除,俺实在玩不会这玩意。。。。。。。

  41. Duron800
    117.79.232.*
    链接

    Duron800 2010-11-01 16:13:41

    老赵还是不要回复那个人的无聊的问题了。弄得回复这么长,可有用的又不多。

    与我们之前做的一些扩展一样,工作分为语言和框架两部分。语言方面的异步工作是基于Task的

    下一段开头也是语言方面,上面这个引用里的应该是框架方面吧?

  42. 老赵
    admin
    链接

    老赵 2010-11-01 16:19:39

    @Duron800

    没写错,不过我改了一点,就不会有误解了,呵呵。

  43. 链接

    Ivony 2010-11-01 18:14:15

    虽然斗嘴很好看,但基本上永远都是各说各的。。。。

    mcpssx说的有些不无道理,但是老是抓着.NET性能不佳被放弃的辫子显然是不够的。

    一个公司放弃某种技术使用某种技术一定都有复杂的从上到下的问题存在,当然在放弃一种技术的时候总要数落一番这种技术的缺点。.NET最为人所知的就是性能欠佳(我没说这是事实,只是买菜老太他家儿子都听说而已),所以这种声明其实毫无意义。

    就像导演不选择某个女演员一样永远宣称是演技问题一样,说不定是长相和宾馆里的问题。

    为什么没有用.NET写的XXX这样的论调则更说明不了任何问题,难道说没有钻石做的菜刀就说明钻石切不了菜?

    每一个东西都有自己的定位,不能说,.NET的改进与你的期望不相符,就是垃圾和毫无意义的。或者说,不去改善你所需要的东西就是不务正业。

    微软也没有必要为了初学者更能了解原理而将语言简化成一种任何事情都要清晰的描述原理和步骤的样子,如果要了解执行原理的话,写汇编岂不更好?C#和C++本来就是定位不同的语言。或者说C#本来就不是一种教学用语言,

  44. 链接

    Ivony 2010-11-01 18:27:46

    两个建议啊:

    1、因为代码基本上要放大图才能看到,所以为啥不将代码作为文本形式放在最后呢。

    2、这段文字:

    在未来某一时刻t1和t2会执行完,我们假设t2先结束。此时它会说:我完成了,执行回调函数/continuation吧。

    这里的描述很容易让人迷糊(我承认我迷糊了一下),准确的说是t2里面的await DownloadFeedAsync(url);执行完成了,而不是t2结束或者完成。

    建议修改为:

    在未来某一时刻t1和t2都会执行完成,我们先来看t2的情况,我们假设t2的DownloadFeedAsync(url)任务已经完成了。此时它会说:我完成了,执行回调函数/continuation吧。

    于是它会和发起线程的SynchronizationContext交互,给UI线程发一个消息,让后续任务在UI线程上继续执行──您的代码不用关注这些。现在代码运行至SaveDocAsync上了,这是另外一个异步任务。await让代码在这里释放UI线程,UI线程又可以执行目前还未结束的任务了。

    于是SaveDocAsync任务完成了,UI线程又获得了一个消息执行后续工作。

    此时任务便到达了ProcessFeedAsync的末尾,于是t2任务结束了。

  45. 链接

    Ivony 2010-11-01 18:34:00

    这个幻灯片应该是Anders弄的吧,我在想,这一段可能他原本打算是让t1和t2在UI线程上交错执行的,因为这样才能更好的说明异步使得线程的利用率大大提高。但是如果流程画成那样的话,就更难讲清楚了。

    不过,我看了半天,觉得

    于是它会和发起线程的SynchronizationContext交互,给UI线程发一个消息,让后续任务在UI线程上继续执行

    这里好像是很闪的亮点啊。

  46. Ricepig
    221.223.87.*
    链接

    Ricepig 2010-11-02 00:12:53

    额,我怎么发现await和async这个原理讲解,就很像WinAPI里的WaitAny这些非繁忙等待哇。。。

    当初从《Win32多线程编程》这本书就看到了这个非忙等待的方法,终于直接被某种语言直接支持了,确实省了不少事情

    不过,语言封装的东西太多,对于入门者来说,不了解来龙去脉就直接使用,容易有误区吧,呵呵。尤其是以前没有经历过while(WaitAny(...)){}这种代码,还真不知道咋回事了。

  47. Ricepig
    221.223.87.*
    链接

    Ricepig 2010-11-02 00:18:19

    楼上某位老要把C++和C#比,说C#没有libevent的轮子党童鞋

    我是不是可以说,因为在某些操作系统中还在用汇编情况下,C++和汇编比就是烂货呢?

    抨击C#的性能是没有问题的,但是老赵说的只是async会让C#的伸缩性“更”好,这有啥问题呢。难道C++性能比汇编差,就说明C++性能很差吗?

    那大家都去写机器码好了哇,不但速度快,而且不用编译了呢。

    语言其实有的时候也是一个平衡的艺术,有得有失,每一门语言都有它的适用范围。

    对于C++语言,大家就很爱做轮子党,什么都自己做一个,都觉得挺好挺牛逼。

    对于C#语言,类库完整的多,轮子党相对来说就没那么多,而且C#的优势其实也是在快速开发。拿C#和C++比那一点性能优势,就和用C++和汇编比那一点性能优势差不多吧。

  48. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-11-02 00:27:44

    至于纽约时报的问题,请看这篇报道,可以看出问题是两点:一是WPF和Silverlight的代码难以复用,二是字体呈现上的奇怪表现,丝毫不关性能问题,也不是Silverlight跨平台能力的问题。

    1, 为什么代码不能复用呢?而flash air可以呢?这就回到了我一直说的微软的技术延续性的问题,老赵们老是强调思想的继承,这在现实中间是不够的。

    2、大家都知道,WPF那个字体经常是糊糊的,这完全是可用不可用的问题。不知道微软是在搞什么名堂,这样的产品也能放出来。

    3、纽约时报明确说了“但遗憾的是,Silverlight版本带来了各种问题,而缺少跨平台的支持则成为其致命的障碍。”这明显就是跨平台的问题。

    4、同一篇报道也明确指出“去年微软宣布和美国职棒大联盟合作,对方在官网视频直播中使用 Silverlight,但是到年底,美国职棒大联盟又表示将放弃Silverlight选择Flash,理由是Flash性能更佳.”

  49. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-11-02 00:33:54

    为什么没有用.NET写的XXX这样的论调则更说明不了任何问题,难道说没有钻石做的菜刀就说明钻石切不了菜?

    问题就是.net竞争的就是菜刀,有这么几把菜刀给你写可伸缩性的服务器架构,C的libevent, java的mina等等,那C#就告诉你,我们有个await的关键字可以更伸缩。

    那么你会怎么选择?

    我看这样竞争,.net必败无疑。

  50. waynebaby
    64.71.140.*
    链接

    waynebaby 2010-11-02 01:01:21

    并没有rx那么激动人心嘻嘻

  51. waynebaby
    112.64.190.*
    链接

    waynebaby 2010-11-02 01:16:14

    为什么代码复用不高?因味那时候没有好的mvvm框架,现在有

    实施人做得烂,大多是领域不熟悉,项目沟通不好

    如果这和技术有关就有趣了,因为类似问题c++遇到的更多

    大家都知道的字体问题不是早解决了么?我现在也不能指责恁没断奶。

    不可用的技术一定要上,这是纽约时报管理腐败。

  52. waynebaby
    112.64.190.*
    链接

    waynebaby 2010-11-02 01:20:07

    一个放视频的网站,性能的好坏主看链接速度和解码速度。别的图形加速测试你可以满大街搜,flash真没什么优势,

  53. 老赵
    admin
    链接

    老赵 2010-11-02 01:41:43

    @mcpssx: 为什么代码不能复用呢?而flash air可以呢?这就回到了我一直说的微软的技术延续性的问题,老赵们老是强调思想的继承,这在现实中间是不够的。

    愈发扯了,还延续性,延续性个屁。新闻里都告诉你因为Silverlight是子集,WPF是超集,所以类库覆盖面有所不同。纽约时报因为使用了WPF这个不能跨平台的技术,所以必须另写一个Silverlight应用程序。这再正常不过了,而Flash跨平台的优势那是没有办法了,谁让它是标配,每机一个。如果纽约时报需要跨平台,那一开始就不该用WPF。

    Silverlight跨平台不行?我还奇怪你给的是哪句话,因为我的新闻里根本没这么说。我用你说的这句话去搜,就找到一些无根无据无头无尾的猜测文章。关于MLB的问题,还“同一篇报道”呢,MLB用Flash不用Silverlight还是因为普及率的问题,关性能什么事情。如果你要说性能,为什么NBA、NCAA、Blockbuster MovieLink、Netflix都还在用Silverlight呢?你说到底也就盯着单个不利于微软的决策说话罢了。

    你找消息要靠谱些,找个专业的新闻站点,有英文对照,当事人说明的。要找负面消息太容易了,网上一搜一大把,你都拿来做论据没有意义。对于一些恶心站,我怀疑对于他们来说,Silverlight都只是听说个名字。

  54. 老赵
    admin
    链接

    老赵 2010-11-02 01:50:22

    @mcpssx: 问题就是.net竞争的就是菜刀,有这么几把菜刀给你写可伸缩性的服务器架构,C的libevent, java的mina等等,那C#就告诉你,我们有个await的关键字可以更伸缩。

    C#会告诉你,IIS伸缩性很好(不信来测试),有了await关键字可以轻松用上这个伸缩性,比libevent,mina要省事儿好几倍。照你的意思用户是不是应该会说:“这伸缩性不是.NET带来的,是IIS带来的,不用”。嗯嗯,这种以空打空的讨论也挺有的意思的,是吧。

  55. 链接

    zsbfree 2010-11-02 02:44:18

    不明白老赵为什么和他辩论。。。 有些人就是那样。。。因为和一个xx辩论的结果是把自己也变成了一个xx.. 期待你更好的文章。 老赵把博客转移到这里是明智的,博客园现在差不多快成了垃圾新闻的场地了 也不知道创始人是怎么想的。。

  56. 链接

    zsbfree 2010-11-02 02:46:32

    @mcpssx: 问题就是.net竞争的就是菜刀,有这么几把菜刀给你写可伸缩性的服务器架构,C的libevent, java的mina等等,那C#就告诉你,我们有个await的关键字可以更伸缩。那么你会怎么选择?我看这样竞争,.net必败无疑。

    败不败的管你屁事。白天没鸡巴事,晚上鸡巴没事

  57. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-11-02 04:50:31

    @老赵

    愈发扯了,还延续性,延续性个屁。新闻里都告诉你因为Silverlight是子集,WPF是超集,所以类库覆盖面有所不同。纽约时报因为使用了 WPF这个不能跨平台的技术,所以必须另写一个Silverlight应用程序。这再正常不过了,而Flash跨平台的优势那是没有办法了,谁让它是标配,每机一个。如果纽约时报需要跨平台,那一开始就不该用WPF。

    可是你忘了一件事情,纽约时报是改用AIR了,在adobe的产品中,air相当于wpf,flash相当于silverlight,就是说AIR和flash的延续性很好。

    Silverlight跨平台不行?我还奇怪你给的是哪句话,因为我的新闻里根本没这么说。我用你说的这句话去搜,就找到一些无根无据无头无尾的猜测文章。关于MLB的问题,还“同一篇报道”呢,MLB用Flash不用Silverlight还是因为普及率的问题,关性能什么事情。如果你要说性能,为什么NBA、NCAA、Blockbuster MovieLink、Netflix都还在用Silverlight呢?你说到底也就盯着单个不利于微软的决策说话罢了。

    请看你发表过文章的infoq是这么说的

    从那时起,纽约时报还为OS X用户提供了一个基于Silverlight的应用,但遗憾的是,Silverlight版本总是充满了各种问题,有政治上的,也有技术上的。最大的障碍就是缺少跨平台的支持。

    infoq靠谱吗?

  58. abc
    122.70.40.*
    链接

    abc 2010-11-02 04:52:25

    等下集,看anders能把compiler as a service玩出哪些花样,有一个遗憾是那么多的这个特性那个特性,没有统一到一个简单强大的理论里面,所带来的问题是,新特性与现有语言特性的组合应用问题,这方面的工作量可能真的不小。F#在这方面的负担应该轻得多。

  59. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-11-02 05:01:40

    @老赵: C#会告诉你,IIS伸缩性很好(不信来测试),有了await关键字可以轻松用上这个伸缩性,比libevent,mina要省事儿好几倍。照你的意思用户是不是应该会说:“这伸缩性不是.NET带来的,是IIS带来的,不用”。嗯嗯,这种以空打空的讨论也挺有的意思的,是吧。

    我认为老赵你这个论证是完全错误的

    1. iis是C++的,不是.net的,我不能说apache伸缩性很好来论证上面每个cgi脚本语言的语法都高伸缩了。
    2. 我们都知道memcached是基于libevent,他并不是基于apache的吧?好了,现在如果大家要一个.net下的缓存产品,怎么写?基于iis开发?
    3. 难道说.net的高性能服务框架就要依赖iis?这完全没有道理嘛。
    4. linux下mono怎么办?iis也能跨平台?
    5. await怎么在asp .net下用?你在什么场景用?你一个页面里面的逻辑还要用await调度?
  60. mathgl
    222.216.162.*
    链接

    mathgl 2010-11-02 05:02:35

    所以我的观点一直是统一的:我说mono跨平台,是说它在服务器端,基本不用做什么修改,我什么时候说过它跨WPF程序了?不要把我没有说过的话拿出来说。这次我写了文章还算有个记录,否则你随口一说,好像我还真的莫名奇妙了。

    mono 目前不支持wpf。。将来我个人认为也不会有人去做这个事,如果不是不可能。跨平台的gui本来就是件很tricky又花精力的事情。现在mono对于winform的支持才是勉强可用,估计没什么精力去做wpf。看它的roadmap似乎没有这个计划。

  61. 老赵
    admin
    链接

    老赵 2010-11-02 05:12:25

    @mathgl

    mono不做跨平台的UI,做的是各平台原生UI的绑定。

  62. 链接

    Ivony 2010-11-02 05:14:34

    可是你忘了一件事情,纽约时报是改用AIR了,在adobe的产品中,air相当于wpf,flash相当于silverlight,就是说AIR和flash的延续性很好。

    显然这个说法是错的。。。。

    当然,关于WPF是超集的说法也是有待商榷的。毕竟WPF只是基于.NET的一套UI框架,而Silverlight不仅仅是呈现框架,还包括了一个完整的轻巧的跨平台的类似CLR的运行时。

    所以很明显,Silverlight类比于Flash是靠谱的,但AIR与Windows Presentation Framework完全是风马牛不相及的东西(MPF可能可以与其类比,如果有的话)。与AIR类比的东西,还得是Silverlight,事实上在那群头脑做出决定的时候,Silverlight已经落地(OOB)。使用WPF和Silverlight两套技术分别在Windows和OSX上开发更像是一个猪头技术总监干的事情。WPF并不是Silverlight for Windows,你可以说MS的宣传策略有问题但这显然与技术无关。

    另,对Flash早期版本有所了解的童鞋都会知道,Flash的字体问题比WPF/Silverlight恶心N倍,被恶心的时间也跨越了N年。以今天对微软苛刻的眼光来看,Flash简直比代谢产物还不如。

  63. 老赵
    admin
    链接

    老赵 2010-11-02 05:17:43

    @mcpssc

    每次我都说“我说最后一遍”,最后还是忍不住回:

    我说了八百遍,我不关心伸缩性是.NET还是IIS带来的,只要能够在.NET上体现出来就行了。如果Apache伸缩性提高,且每个CGI脚本都能轻松用上,一样可以说,XXX技术让PHP应用程序伸缩性提高。而且,我也说过好几遍,WCF已经证实,.NET的Socket的伸缩性不需要依赖IIS,基于它的TCP性能比IIS的HTTP更高。

    mono虽然可以跨平台,但性能跨不了,就像Java目前没法在Windows下利用IOCP,异步IO性能就远不如Linux。

    从PDC目前的消息来看,只要在同步页面里的逻辑加上点await以及简单的修改就能转为异步页面了,我熟悉ASP.NET和C#,我都能猜到await在里面做了些什么。不过我奇怪的是你居然会问出await怎么在ASP.NET里用,讨论到现在我忽然意识到你似乎根本没有看文章?

  64. 老赵
    admin
    链接

    老赵 2010-11-02 05:20:23

    @mcpssx: 可是你忘了一件事情,纽约时报是改用AIR了,在adobe的产品中,air相当于wpf,flash相当于silverlight,就是说AIR和flash的延续性很好。

    崩溃,纽约时报用的是AIR,不是Flash。AIR本身就可以跨平台,他们为什么要去再做个Flash?如果你觉得两者是等同关系,而不是父子集关系,也不妨详细说说,我不是很清楚。

    至于你对InfoQ的文章的理解,我认为那说的“跨平台问题”是WPF,不是指Silverlight。因为WPF不能跨平台,因此必须再写个Silverlight。Silverlight工作的很好,只是让纽约时报必须维护多份代码了,不爽了,于是改成Adobe AIR。

  65. 老赵
    admin
    链接

    老赵 2010-11-02 05:26:08

    @Ivony: 关于WPF是超集的说法也是有待商榷的。毕竟WPF只是基于.NET的一套UI框架,而Silverlight不仅仅是呈现框架,还包括了一个完整的轻巧的跨平台的类似CLR的运行时。

    我倒不是很在乎两者的Runtime的区别,主要是谈类库方面的问题。就像我也把mono、MonoTouch和MonoDroid看作是.NET,但是它们无论从运行原理都和.NET不同。他们相同的是大部分的类库、开发方式、技巧(例如表达式树构建、反射)等东西。

  66. waynebaby
    112.64.190.*
    链接

    waynebaby 2010-11-02 05:56:26

    air 就是多个flash 打个zip包在客户端假装本地程序运行。 和安装在桌面的silverlight4一个路数。

  67. waynebaby
    112.64.190.*
    链接

    waynebaby 2010-11-02 05:57:02

    所以说,某人说的air相当于wpf 是根本不懂air啊。。哈哈

  68. 老赵
    admin
    链接

    老赵 2010-11-02 05:59:01

    @waynebaby

    原来AIR相当于Silverlight桌面版啊,唉,我也土了。

  69. RMay
    218.80.238.*
    链接

    RMay 2010-11-02 06:44:59

    @mcpssx

    1、从C++写的换到WPF,性能下降,这很正常,在XP上就是。因为XP操作系统的渲染方式就不是DirectX的,Vista和Win7上的表现则完全不一样。我想,3.0的时候,还是以XP的机子为主吧?

    2、WPF字体渲染的问题,在4.0里面已经搞定了。就算是3.0/3.5,你也可以自己写个TextBlock,用GDI来渲染字体,照样很清楚。其实,我最想问的是,你做过WPF/SL的开发么?知道这两个东西是咋回事么?只靠道听途说,不太好吧?

    3、如果你那么在意跨平台(客户端),那么确实,请别用.Net了。但实际上,你用java什么的,就能保证你的代码完全没有问题了么?IBM和SUN的虚拟机还不一样呢,照样出很多诡异的问题。

    4、文中提到的异步编程方式的改进,说实在的,在我看来,跟是不是.Net,是不是C#,屁关系都没有,如果你搞个X#语言也能如此提高生产效率,那我就用这个去。

  70. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-11-02 09:40:02

    @waynebaby,老赵

    我觉得两位就是过于机械了,难道说air非要与flash搞到不兼容才能与wpf相比?本来就是一个表现层, wpf画一条线一定要和silverlight不同吗?本地和插件的主要区别是安全问题,不是能力问题。以前ActiveX就能做本地程序能做的任何事情。

    adobe可以重用flash这正是一个优势,设计wpf和silverlight还要两套设计工具,难道说非要搞到不兼容反而是优势了?

  71. 老赵
    admin
    链接

    老赵 2010-11-02 10:04:15

    @mcpssx

    之前都说了,Flash和AIR相当于Silverlight和Silverlight离线版。你非要拖一个WPF上来混战,说它和Silverlight不兼容是个错误,太能找茬了。你怎么不说WPF可以做到AIR所做不到的事情呢?

  72. driedbeef
    113.76.81.*
    链接

    driedbeef 2010-11-02 14:52:15

    Anders这个Session的视频我也在PDC网站上看了,感觉还不赖。

    将一些共性的东西,优美的解决方案逐渐沉淀到框架和语言当中,可以说是一种必然趋势,这在.NET Framework/C# Language当中做得似乎“过于成功”了。个人很喜欢这种“语法糖”,不过我更愿意去探究编译器在这些“魔法”背后做了什么,设计者经过了哪些抽象和纠结,得到的解决方案。

    让程序和机器去做这些模式化的体力活,将写程序的人解放出来做更高层次的思考。做不到前者的人没有现在,做不到后者的人没有未来。

  73. 链接

    陈梓瀚(vczh) 2010-11-03 09:25:25

    @driedbeef

    那你可以跟我一样没事在vlpp.codeplex.com上写个编译器做点研究什么的,就可以同时享受知识和.net带来的双重乐趣了哈。

  74. driedbeef
    113.106.106.*
    链接

    driedbeef 2010-11-03 10:23:00

    @陈梓瀚(vczh)

    高科技产品,有空研究一下。

  75. bluetrees
    222.70.192.*
    链接

    bluetrees 2010-12-21 04:49:59

    async和await这两个语法糖,的确是革命性的改进,他把并行计算的模型从Thread使用中解放出来。

    但也不是完全没有毛病的,默认的task的调度器在很多场合不适用,此外,任务队列也太重。我往文件里面并行的插入10万条记录,我用async和await组合,先产生了10万个任务,用了0.7秒,这些任务全部完成用了20秒。我用传统的创建Thread的方式并行插入,10个线程,每个线程插1万条,0.6秒就完成了,也就是说产生10万个任务的时间甚至超过了插入实际的记录的时间。为了对比,我用一个线程插入10万条记录,用了1.07秒。

    这挺能说明说明那个调度器的效率的。

  76. 老赵
    admin
    链接

    老赵 2010-12-21 08:22:12

    @bluetrees

    往文件里并行插入有没有代码可以看看?其实async和await其实只是辅助异步工作,并行计算的基本原则还是要遵守的。

    例如你创建了10万个任务,这就是用法上的问题了,应该把大任务切分成少量的任务,每个任务多做点事情。其实你原本用10个线程工作,现在用10个任务就行了。我在使用的时候没有遇到过调度上的性能问题,调度器效率再高,调度10万个任务开销也是很夸张的,不能这么比。

  77. 链接

    airwolf2026 2012-05-18 05:55:40

    how does it work 那节编译器生成的代码,有点2.x时代的begin/end的感觉哈哈.那个真是头痛的使用方式,我第一次接触.net异步编程的时候,以为框架提供的 就是类似async和await的相识用法的,结果看了msdn看了半天一头雾水,原来没有那么自然的表达. 期待win8普及哈.现在产品还是2.0写的.

  78. 老赵
    admin
    链接

    老赵 2012-05-20 04:41:08

    @airwolf2026

    本来就是编译器帮你生成丑陋的代码嘛。

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我