gpt4 book ai didi

c# - 退出在 C# 中读取的 TCP 上阻塞的线程

转载 作者:可可西里 更新时间:2023-11-01 02:38:00 26 4
gpt4 key购买 nike

我的服务器/客户端启动一个新线程“readerThread()”来读取传入的 tcp 流量。该线程在 read() 上阻塞。我怎样才能退出这个 readerThread()。

一种方法是启动另一个线程,当线程要退出时关闭套接字,这样读取就会退出。有没有更清洁/更好的方法。

最佳答案

我误解了这个问题。这是我认为您应该做的。

  • 如果您在父线程中创建套接字,并且只使用新线程读取传入数据,那么我建议调用 Socket.Shutdown()。这样 Receive 方法将返回 0(未读取字节),您可以退出线程的方法。关闭将禁用发送/接收,但如果缓冲区中有任何数据等待发送/接收,它将确保在关闭套接字之前发送/接收它。如果您在套接字在 Receive 上被阻塞时调用 shutdown,您的 Receive 方法将返回 0,但它会抛出一个套接字异常,套接字错误代码 = Shutdown(或 10058)。所以准备好捕获并处理它。

  • 如果您在新线程中创建套接字,并且它接受新连接(Socket.Listen() 和 Socket.Accept),那么您可以从父线程连接到该套接字,并且发送 0 个字节。当 Receive 方法返回 0 字节时,您可以退出新线程。

  • 如果您在新线程中创建套接字,并且它只能是一个客户端(与其他套接字连接),那么这根本不是一个好方法。您可能必须中止线程(不推荐),除非您将服务器配置为在您希望客户端套接字关闭时发送 0 字节,但这样您的客户端应用程序将依赖于服务器来关闭套接字。

关于c# - 退出在 C# 中读取的 TCP 上阻塞的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1325135/

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