gpt4 book ai didi

c# - 正确实现多线程+套接字应用

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

我有一个服务器和一个客户端应用程序,这是它目前的实现方式:服务器在它自己的线程中有一个循环,它通过 TcpListener 监听新连接。如果有人连接,它会将 TcpClient 传递给一个专门监听该 TcpClient 的循环,并通过 NetworkStream 处理与该用户的所有交互。

在客户端,我有一个连接到服务器的 TcpClient。我的理解是我需要将它分支到不同的线程,因为任何 IO 都会将其置于阻塞模式,我不能让它停止主线程。

到目前为止,我的理解是否正确?有没有更简单的方法来确保异步通信而不停止任何一个程序的主线程?

无论哪种方式,对于我的主要问题:如何确保所有这些线程和套接字都得到妥善处理?如果程序在仍处于阻塞模式时退出,它似乎会卡住。那么我该如何中止套接字上的所有 IO 并告诉子线程中的无限循环我们已经完成了呢?

顺便说一句,这也是一个 Unity3d 项目,以防发生任何变化。

最佳答案

将每个新连接移交给它自己的线程可能会限制您的可扩展性。也没有理由要求客户端中的 I/O 线程切换。

您可以使用异步 I/O 解决这两个问题。 BeginConnect/EndConnect 在客户端,BeginRead/EndRead, BeginWrite/EndWrite 在服务器端用于读取和写入。

然后一切都可以是事件驱动的,而不需要您自己的新线程。连接完成首先触发异步读取,然后每次读取完成都会在该套接字上发布一个新的异步读取调用 - 无论如何,写入总是从您的 POV 确定。

关闭套接字将导致挂起的读/写错误退出,然后您应该能够干净地退出该过程。小心实现适当的锁定(可能 lock() 将是您所需要的)以确保套接字在关闭后不会在任何地方使用。

关于c# - 正确实现多线程+套接字应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6643058/

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