使用Asp.Net进行asynchronous编程的最佳方法

目前似乎有几个选项可用于使用asp.net进行asynchronous/推式编程。 但我有点困惑,什么是最好的,什么提供了最开发人员友好的方法。 我已经遇到的事情是,

的NodeJS

SignalR

使用PushStreamContent(Web API)和类似KnockoutJS的东西

虽然SignalR被认为是asp.net 4.5 ,但是在MS (特别是Azure周边)中,我看到了很多NodeJ的兴趣。 任何人都可以阐明(至lessNodeJs和SignalR)的差异?

SignalR是“.NET的一个客户端和服务器端的库,它提供消息和一个持久连接的抽象。” 这不会奇迹般地让你的代码asynchronous – 它只是让你的服务器asynchronous调用客户端(包括运行在用户浏览器中的JavaScript)。

但是,在.NET 4.5和Visual Studio 2012(以及Mono 2.11+)中发布的C#5.0允许您通过使用新的asyncawait关键字来编写/修改代码,使其成为asynchronous。

如果您已经是一名.NET开发人员,则C#async&await和SignalR非常容易进行升级,学习和运行,从而构build高度可扩展的高性能系统。

Node.js使您能够使用JavaScript编写代码并将其托pipe在应用程序服务器中。

Node目前正在引起很多关注,但是如果你来自.NET开发背景,那么在服务器上移动到JavaScript时,值得一提的是,

  1. JavaScript是一个非常强大且非常灵活的dynamictypes语言。 然而,这种灵活性可能是非常危险和有问题的,直到你知道了它的许多缺陷以及如何克服它们。 如果您必须执行JavaScript代码,请考虑使用TypeScript和CoffeeScript等语言来编写源代码,这些语言可以编译为JavaScript,但却使JavaScript远离了许多JavaScript的危险。

  2. 虽然节点提供了很好的asynchronous调度function,但是它的代码执行性能可能比执行C#更慢。 如果你的代码很less/不处理数据,你可能不会注意到这个问题。 但是,如果您的代码执行了大量的数据处理/计算/分析等,则可能会发现节点的JavaScript性能不可接受。

  3. 节点是单线程的! 如果您的代码必须执行一些繁重的处理,例如,对大量数据执行复杂的计算,则会阻止单个节点实例为每个处理操作完成之前的其他传入请求提供服务。 因此,您需要计划启用节点集群 (目前是实验性function),或者如果您在Windows上托pipe节点 ,则使用IIS和IISNode] 4 ,它使用(awesome)IIS和Windows进程激活基础结构来处理节点实例pipe理。

  4. 与典型的.NET开发人员的debugging体验相比,在节点下运行的debugging代码现在是一个缓慢而繁琐的过程。 要做到这一点,需要使用node-inspector和Chrome网页浏览器来debugging代码,但是体验很差:跨运行时不会保留断点; 不支持条件断点; 显示的调用栈很浅; 等等