【发布时间】:2009-06-10 00:26:00
【问题描述】:
我希望将 Windows C++ 应用程序迁移到 C#,以便一些主要的增强功能更容易一些。 C++ 应用程序是单线程的,并使用自制的反应器模式来处理接受、读取和写入套接字和计时器的所有事件。所有套接字处理都是异步完成的。
实现 C# 反应器模式的公认方法是什么?是现有的图书馆吗?
【问题讨论】:
标签: c# design-patterns asynchronous
我希望将 Windows C++ 应用程序迁移到 C#,以便一些主要的增强功能更容易一些。 C++ 应用程序是单线程的,并使用自制的反应器模式来处理接受、读取和写入套接字和计时器的所有事件。所有套接字处理都是异步完成的。
实现 C# 反应器模式的公认方法是什么?是现有的图书馆吗?
【问题讨论】:
标签: c# design-patterns asynchronous
布罗菲尔德,
不幸的是,C# 世界的心态仍然存在于每个连接领域的线程中。我正在寻找一种在单个 Compact Framework/Windows CE 机器上处理多个连接的方法,并希望编写自己的 Proactor/Reactor 模式(仿照 ACE 中使用的模式)Compact Framework 似乎不支持异步连接 -只是异步读写。我还需要严格控制超时(软实时应用程序)。
艾伦,
实现前摄器/反应器模式的一个原因是您不必为每个连接都运行一个线程。 Web 服务器就是典型的例子。一个繁忙的服务器在任何时候都可以轻松地拥有 100 多个处于活动状态的连接。有了这么多线程(我已经看到有一个线程读取,另一个线程写入数据的实现),在上下文切换中花费的时间变得很重要。在 750Mhz ARM 处理器上的 Windows CE 下,我测量了超过 1 毫秒,峰值高达 4 毫秒。
我仍然发现我遇到的大多数 C# 和 Java 应用程序仍然有太多的线程在运行。似乎是一切的解决方案 - 启动另一个线程。例子。甚至在我实际打开一个项目之前,Eclipse(IDE)就使用了 44 个线程。 44线程???到底要做什么???这就是 Eclipse 这么慢的原因吗?
【讨论】:
阅读Asynchronous Programming in C# using Iterators;
在本文中,我们将了解如何编写执行异步操作的程序,而无需典型的控制反转。简要介绍一下我所说的“异步”和“控制反转”的含义——异步是指执行一些不需要阻塞调用线程的长时间运行操作的程序,例如访问网络、调用 Web 服务或执行任何其他操作一般的 I/O 操作。
【讨论】:
Windows 内核有一个非常好的异步等待 API,称为 I/O 完成端口,它非常适合实现反应器模式。不幸的是,.NET 框架中的 System.Net.Sockets 库并未将 I/O 完成端口完全公开给开发人员。 System.Net.Sockets 的最大问题是您无法控制哪个线程将异步完成事件出列。您的所有异步完成都必须发生在框架为您选择的某个随机全局 .NET ThreadPool 线程上。
【讨论】:
.NET 线程、套接字和事件处理在 C# 和 .NET 中具有一流的支持,因此对外部库的需求非常小。换句话说,如果您知道自己在做什么,该框架可以非常直接地滚动您自己的套接字事件处理例程。
我工作的两家公司都倾向于重用默认的 .NET Socket 库,就像所有网络连接一样。
编辑添加:基本上这意味着这是一个了解 .NET/C# 中的委托、事件、线程和套接字的绝佳机会
【讨论】:
检查SignalR。看起来很有希望。
【讨论】:
在谷歌代码上查看项目Interlace。我们在所有产品中都使用了这一点。
【讨论】: