有C#reactor / proactor库吗?

时间:2009-06-10 00:26:00

标签: c# design-patterns asynchronous

我希望将Windows C ++应用程序移动到C#,以便一些主要的增强功能更容易一些。 C ++应用程序是单线程的,并使用自行生成的反应器模式来处理接受,读取和写入套接字以及定时器的所有事件。所有套接字处理都是异步完成的。

实现C#反应器模式的可接受方法是什么?是现有的库吗?

6 个答案:

答案 0 :(得分:4)

brofield,

不幸的是,C#世界的心态仍然存在于每个连接领域的线程中。我正在寻找一种方法来处理单个Compact Framework / Windows CE盒子上的多个连接,并期待编写我自己的Proactor / Reactor模式(在ACE中使用的模式之后形成)Compact Framework似乎不支持异步连接 - 只是异步阅读和写作。我还需要管理对超时的严格控制(软实时应用程序)。

艾伦,

实现proactor / reactor模式的一个原因是,您不必为每个连接运行一个线程。 Web服务器是典型的例子。繁忙的服务器可以在任何时间轻松地激活100个连接。有了那么多线程(我已经看到有一个线程要读取,另一个要写入数据的实现),在上下文切换中花费的时间变得非常重要。在750Mhz ARM处理器上的Windows CE下,我测量了一毫秒,峰值高达4毫秒。

我仍然发现我遇到的大多数C#和Java应用程序仍然运行着太多的线程。似乎是一切的解决方案 - 开始另一个线程。例。 Eclipse(IDE)甚至在我实际打开项目之前就使用了44个线程。 44个帖子????完全做什么???这就是为什么Eclipse太慢了?

答案 1 :(得分:4)

阅读Asynchronous Programming in C# using Iterators;

  

在本文中,我们将了解如何编写执行异步操作的程序,而无需典型的控制反转。简要介绍“异步”和“控制反转”的含义 - 异步是指执行一些长时间运行操作的程序,这些操作不需要阻塞调用线程,例如访问网络,调用Web服务或执行任何其他操作一般的I / O操作。

答案 2 :(得分:3)

Windows内核有一个非常好的异步等待API,称为I / O完成端口,非常适合实现反应器模式。遗憾的是,.NET框架中的System.Net.Sockets库并未向开发人员完全公开I / O完成端口。 System.Net.Sockets的最大问题是您无法控制哪个线程将异步完成事件出列。所有异步完成必须发生在框架为您选择的一些随机全局.NET ThreadPool线程上。

答案 3 :(得分:2)

.NET线程,套接字和事件处理在C#和.NET中具有一流的支持,因此对外部库的需求非常少。换句话说,如果您知道自己在做什么,那么框架可以非常直接地推出自己的套接字事件处理例程。

我工作的两家公司都倾向于重复使用默认的.NET Socket库,而不是像所有网络连接一样。

编辑添加:基本上这意味着这是一个了解.NET / C#中代理,事件,线程和套接字的绝佳机会

答案 4 :(得分:2)

检查SignalR。它看起来很有希望。

答案 5 :(得分:0)

在Google代码上查看项目Interlace。我们在所有产品中都使用它。