-3

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

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

如果我使用多个线程来使用 CPU 的所有内核(鉴于我不想使用进程),我将使用 Unix FIFO 来传输消息并在每个线程上使用仍然轮询/选择(与文件/套接字/fifos 完美配合) /)。事情仍然非常简单,同时非常高效。

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

我想知道 C# 是否有任何类似的选择/轮询框架?

4

2 回答 2

2

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

话虽如此,在更高级别的类中建立在套接字之上的新异步方法往往具有许多优点。一旦你学习并理解了它们是如何运作的,它们就会非常高效,并且可以更好地进行开发。

这一直延伸到堆栈——“最高级别”的抽象是像WCF这样的框架,它在生产力、可靠性、安全性和易于开发的许多类型的应用程序方面提供了巨大的好处。

于 2013-01-29T17:38:19.030 回答
0

BeginInvoke(或基于 Begin/End 模式的任务)是 .NET 上异步编程的标准模型。它们确实强制继续回调在线程池上运行。如果您对此感到满意,那么 Begin/End 模型实际上是非常高效和好的(就像基于回调的代码一样好......)。

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

选择/轮询当然不是提高效率的方法。尽管 .NET 套接字支持它。

你说

优雅地关闭阻塞服务器

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

于 2013-01-29T17:38:04.423 回答