.NET 的 Node.js
Posted
技术标签:
【中文标题】.NET 的 Node.js【英文标题】:Node.js for .NET 【发布时间】:2014-03-29 00:14:58 【问题描述】:我知道像 Edge.js 这样允许 C# 和 Node.js 连接的项目,但我说的是不同的东西。是否有用于 C# 的库,它允许您在 C# 中构建可扩展、非阻塞 I/O、单线程、异步事件服务器,类似于您可以使用 Node.js 构建的服务器?一个库,它还具有 Node.js 的独特事件模型、用于用户代码的单线程、用于文件/网络事件和本机代码的多线程(如果我错了,请纠正我)。当然,我了解 ASP 和 WCF,以及像 this 这样的 OSS 项目,但我正在寻找能够提供与 Node.js 相当的性能的东西,这是一种 Node.js 到 C# 的端口。你知道任何这样的库吗?构建它需要什么?
单线程还是多线程?
如果你想要一个单线程托管进程 所有使用 APC 和完成端口的工作,你将不得不 手动编码。建造它既冒险又棘手。 -- Sam Salton
显然,单线程使代码更容易编写,因为您不需要使用锁和互斥锁。只有一个线程读取/修改程序状态数据,使事情变得简单。所有计算都在单独的线程上进行,并在结果准备好后返回主线程。操作完成后,所有文件/网络事件都会分支并返回到主线程。
相关但不同的问题:
-
Non-blocking single threaded web server
Minimal web server
Single threaded async events
可能有用的项目:
-
ALE 最接近我想要的,语法类似于 Node.js
Manos de mono,用于 C# 的单线程服务器
message loop in C#,在单个线程上处理事件
C# 中的 Libuv 包装器(1、2)
Anna 仅用于 HTTP 请求(无二进制),语法类似于 Node.js
【问题讨论】:
"是否有 C# 库,允许您在 C# 中构建可扩展、非阻塞 I/O、单线程、异步事件服务器,类似于您可以使用 Node.js 构建的服务器?”当您可以使用 async/await 编写更具可读性的异步代码时,为什么还要以基于事件的方式编写它? ;) 听起来你想让锤子像刀子一样工作,只是硬着头皮在 node 中编写你的应用程序。 仅供参考 - async/await 不会阻塞。 @Geotarget 会吗? Node 实际上只是 javascript,有大量的 C# 到 JS 转换器out there。此外,您可以利用边缘来弥补差距(我目前正在我的应用程序中这样做)。 “node.js 嵌套事件处理程序系统看起来更易于管理” - 我同意,确实如此,这就是为什么如果您真的想要利用您描述的所有功能真的很想把你的代码移植到 Node 上。 不幸的是,我不知道 CLI 的复杂性给你一个详细的答案,但是,有一些库允许你在 .NET 中有效地托管 V8 引擎(如果这是你的之后)喜欢Javascript.NET 【参考方案1】:我已经将此发布到您的第一个相关问题中,这也可能会回答您的问题:
这是一个用 VB.NET 和 C# 编写的开源示例:
https://github.com/perrybutler/dotnetsockets/
它使用基于事件的异步模式 (EAP)、IAsyncResult 模式和线程池 (IOCP)。它将消息(消息可以是任何本机对象,例如类实例)序列化/编组为二进制数据包,通过 TCP 传输数据包,然后在接收端反序列化/解组数据包,以便您使用本机对象.这部分有点像 Protobuf 或 RPC。
它最初是作为实时多人游戏的“网络代码”开发的,但它可以用于多种用途。不幸的是,我从来没有开始使用它。也许其他人会。
源代码有很多 cmets,所以应该很容易理解。享受吧!
【讨论】:
"从来没有开始使用它" = "从来没有调试过它,也从来没有在生产代码中使用过?" 我不是 Node 工作方式的专家,但我一直在寻找一个可以让你在回调中编写回调的系统,就像在 Node 中一样。你的系统允许吗? 从未在生产中使用过。我将在今天晚些时候提交最新的代码,其中包括将二进制协议重构为 HTTP 协议,因为我发现这样做重新产生了兴趣、挑战和乐趣。目前,该框架可以使用 php-cgi 托管 WordPress 站点,但与 Apache 的进程内 mod_php 相比,我一直在研究围绕许多 php-cgi 进程(100、1000 或 10000 个同时请求)的高并发性能。另外,感谢您的询问。如果您想要更完整的东西或为黄金时段做好准备,您可以查看 Nito Async 或 SignalR。 关于回调内部的回调 - 例如doAsync1doAsync2doAsync3 - APM 和 EAP 已被 .NET 4.0 中的 TAP 取代,它本机支持 continuations - 例如Task.ContinueWith(callback) - 类似于 Node.js 如何使用 promises 管理“回调地狱”。一旦 HTTP 协议可以正确处理各种站点,我将切换到 TAP。虽然我的回答肯定不是 Node.js 到 C# 端口,但它确实实现了您提到的模式。 few benchmarks 已经把这个项目重新放在了我的雷达上。 我需要二进制,你的意思是重构不再支持二进制协议了吗?以上是关于.NET 的 Node.js的主要内容,如果未能解决你的问题,请参考以下文章