C#中基于select / poll的框架

时间:2013-01-29 17:31:30

标签: c# multithreading

我喜欢编写一个打开许多套接字和文件的应用程序。把它想象成网络服务器(在我的情况下不是这样,但是为了简化这里的问题)。

如果我在Unix上用C语言编写它,我会使用poll / select并且非常高效,因为我没有多个线程,所以一切都很容易编写,同时非常有效。

如果我使用多个线程来使用CPU的所有内核(假设我不想使用进程),我会使用Unix FIFO来传输消息,并在每个线程上使用仍然轮询/选择(它与文件/完美配合)插座/ FIFO的/)。事情仍然非常简单,同时效率很高。

但是当使用C#时,看起来有不同的选择,并且大多数类根本不支持该编程风格(HttpWebListener就是一个例子)。我不喜欢BeginInvoke混乱,因为后台发生了我无法控制的事情(ThreadPooling,优雅地关闭阻塞服务器,......)。

我想知道是否有适用于C#的select / poll相似框架?

2 个答案:

答案 0 :(得分:2)

您实际上可以在C#中使用相同的方法 - 您只需要使用较低级Socket class,它提供SelectPoll

话虽这么说,在更高级别类的socket上构建的新异步方法往往具有许多优点。一旦你学会并理解它们如何运作,它们就会非常高效,并且可以更好地发展。

这一直延伸到堆栈 - “最高级别”抽象是WCF等框架,这为许多类型的应用程序提供了生产力,可靠性,安全性和易开发性方面的巨大优势

答案 1 :(得分:0)

BeginInvoke(或基于Begin / End模式的Tasks)是.NET上异步编程的标准模型。它们确实强制继续回调在线程池上运行。如果你没关系,那么Begin / End模型实际上是非常高效和漂亮的(和基于回调的代码一样好......)。

在我的头脑中,我看不出一个令人信服的理由,为什么我不想使用线程池来完成回调。也许你可以使用IOCP来提高效率。

选择/民意调查肯定不是提高效率的方法。虽然.NET套接字支持它。

你说

  

正常关闭阻止服务器

会有问题。我不明白为什么。你能详细说明吗?