C# 中基于选择/轮询的框架

本文关键字:框架 选择 于选择 | 更新日期: 2023-09-27 17:56:27

我喜欢编写一个打开许多套接字和文件的应用程序。将其视为网络服务器(在我的情况下不正确,但为了简化此处的问题)。

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

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

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

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

C# 中基于选择/轮询的框架

实际上,您可以在 C# 中使用相同的方法 - 您只需要使用较低级别的 Socket 类,它提供选择和轮询。

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

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

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

在我的头顶上,我看不出一个令人信服的理由,为什么我不想使用线程池进行完成回调。也许您可以使用 IOCP 来榨取更高的效率。

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

你说

正常关闭阻塞服务器

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