gpt4 book ai didi

c# - 不使用线程处理多个 TcpClient 连接

转载 作者:太空宇宙 更新时间:2023-11-03 11:38:15 25 4
gpt4 key购买 nike

我有一个 C# 程序,其中有很多(假设大约一千个)打开的 TcpClient 对象。我想进入一种状态,等待任何这些连接发生某些事情。

我宁愿不为每个连接启动一个线程。

有点像……

while (keepRunning)
{
// Wait for any one connection to receive something.
TcpClient active = WaitAnyTcpClient(collectionOfOpenTcpClients);

// One selected connection has incomming traffic. Deal with it.
// (If other connections have traffic during this function, the OS
// will have to buffer the data until the loop goes round again.)
DealWithConnection(active);
}

附加信息:
TcpClient 对象来自 TcpListener。
目标环境将是 MS .NET 或 Mono-on-Linux。
当连接打开时,该协议(protocol)要求长时间空闲。

最佳答案

您尝试执行的操作在 Microsoft 术语中称为异步模式。总体思路是将所有 I/O 阻塞操作改为非阻塞。如果这样做,应用程序通常需要与机器上的 CPU 内核一样多的系统线程。

看看 .Net 4 中的任务并行库: http://msdn.microsoft.com/en-us/library/dd460717%28VS.100%29.aspx

它是对普通的旧 Begin/Callback/Context .Net 范例的非常成熟的包装。

更新:

考虑一下从连接中读取数据后您将如何处理这些数据。在现实生活中,您可能必须回复客户端或将数据保存到文件中。在这种情况下,您将需要一些 C# 基础结构来包含/管理您的逻辑并仍然保持在单个线程中。 TPL 免费为您提供。它唯一的缺点是它是在 .Net 4 中引入的,所以它可能还没有在 Mono 中。

要考虑的另一件事是连接的生命周期。您的连接打开/关闭的频率如何?它们的生命周期有多长?这很重要,因为接受和断开 TCP 连接需要与客户端交换数据包(这本质上是异步的,而且 - 恶意客户端可能根本不会返回 ACK(-nowledged)数据包)。如果您认为这方面对您的应用程序很重要,您可能需要研究如何在 .Net 中正确处理它。在 WinAPI 中对应的函数是 AcceptEx 和 DisconnectEx。可能它们使用开始/结束方法包装在 .Net 中 - 在这种情况下你很高兴。否则,您可能必须为这些 WinAPI 调用创建一个包装器。

关于c# - 不使用线程处理多个 TcpClient 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5541811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com