我喜欢编写一个打开许多套接字和文件的应用程序。把它想象成网络服务器(在我的情况下不是这样,但是为了简化这里的问题)。
如果我在Unix上用C语言编写它,我会使用poll / select并且非常高效,因为我没有多个线程,所以一切都很容易编写,同时非常有效。
如果我使用多个线程来使用CPU的所有内核(假设我不想使用进程),我会使用Unix FIFO来传输消息,并在每个线程上使用仍然轮询/选择(它与文件/完美配合)插座/ FIFO的/)。事情仍然非常简单,同时效率很高。
但是当使用C#时,看起来有不同的选择,并且大多数类根本不支持该编程风格(HttpWebListener就是一个例子)。我不喜欢BeginInvoke
混乱,因为后台发生了我无法控制的事情(ThreadPooling,优雅地关闭阻塞服务器,......)。
我想知道是否有适用于C#的select / poll相似框架?
答案 0 :(得分:2)
您实际上可以在C#中使用相同的方法 - 您只需要使用较低级Socket class,它提供Select和Poll。
话虽这么说,在更高级别类的socket上构建的新异步方法往往具有许多优点。一旦你学会并理解它们如何运作,它们就会非常高效,并且可以更好地发展。
这一直延伸到堆栈 - “最高级别”抽象是WCF等框架,这为许多类型的应用程序提供了生产力,可靠性,安全性和易开发性方面的巨大优势
答案 1 :(得分:0)
BeginInvoke(或基于Begin / End模式的Tasks)是.NET上异步编程的标准模型。它们确实强制继续回调在线程池上运行。如果你没关系,那么Begin / End模型实际上是非常高效和漂亮的(和基于回调的代码一样好......)。
在我的头脑中,我看不出一个令人信服的理由,为什么我不想使用线程池来完成回调。也许你可以使用IOCP来提高效率。
选择/民意调查肯定不是提高效率的方法。虽然.NET套接字支持它。
你说
正常关闭阻止服务器
会有问题。我不明白为什么。你能详细说明吗?