C# 中的线程问题
本文关键字:问题 线程 | 更新日期: 2023-09-27 18:35:18
我用C#编写了服务器/客户端程序的代码。不使用Thread
,它工作正常。如果我使用 Thread
,我会收到以下消息error
。
The thread '' (0x9a8) has exited with code 0 (0x0).
示例代码
public class MyServer{
public MyServer (){
...
...
System.Threading.Thread socThread = new System.Threading.Thread(new System.Threading.ThreadStart(receiveSockets));
socThread.Start();
}
private void receiveSockets()
{
try
{
while(true){
IPAddress ipadd = IPAddress.Parse(systemIPAddress);
TcpListener tcp = new TcpListener(ipadd, 8001);
tcp.Start();
Console.WriteLine("Waiting for client in 8001 port no");
Socket socket = tcp.AcceptSocket();
Console.WriteLine("Client address : " + socket.RemoteEndPoint);
System.Threading.Thread socThread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(receiveData));
socThread.Start(socket);
}
}
catch (Exception e)
{
Console.WriteLine("Error in receive Sockets : " + e.Message);
}
}
private void receiveData(object obj)
{
try
{
while(true){
Socket socket = (Socket)obj;
byte[] data = new byte[1000];
int status = socket.Receive(data);
Console.WriteLine("Received 1.");
string content = Encoding.UTF8.GetString(data, 0, 1000);
Console.WriteLine("Received data 1 : " + content);
}
}
catch (Exception e)
{
Console.WriteLine("Error in receive Data : " + e.Message);
}
}
static void Main(string[] args){
MyServer server = new MyServer();
}
客户端程序
静态空 主(字符串[] 参数){ TcpClient tcp = new TcpClient(); 啧。连接("192.168.1.11", 8001); 流流 = tcp。GetStream(); 字符串 msg ="正在测试..."; 字节[] 内容 = 新字节[消息。长度 * 大小(字符)]; System.Buffer.BlockCopy(msg.ToCharArray(), 0, content, 0, content.长度); 流。写入(内容, 0, 内容.长度);}
我得到以下输出。
IP Addrress : 192.168.1.11
Waiting for client in 8001 port no
Client address : 192.168.1.11:50140
The thread '' (0x9a8) has exited with code 0 (0x0).
A first chance exception of type 'System.Net.Sockets.SocketException' occurred in System.dll
The thread '' (0x1760) has exited with code 0 (0x0).
Error in receive Data : An existing connection was forcibly closed by the remote host
The program '[1396] Window_Server.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0).
请帮我解决这个问题。
您需要弄清楚为什么要抛出套接字异常。如果您阅读 Socket.Receive 的文档,您将看到以下部分:
注意
如果收到套接字异常,请使用 SocketException.ErrorCode 属性获取特定的错误代码。获取此代码后,请参阅 Windows 套接字MSDN 库中的版本 2 API 错误代码文档错误的详细说明。
该链接向您展示了如何读取错误代码:
属性包含与导致异常的错误。
套接字异常的默认构造函数设置错误代码属性,以显示上次发生的操作系统错误。欲了解更多信息有关套接字错误代码的信息,请参阅 Windows 套接字版本2 MSDN 中的 API 错误代码文档。
这应该将您带到错误代码页面。
现在,根据您尚未提供的错误代码,您可以诊断网络问题。
"线程 '' (0x9a8) 已退出,代码为 0 (0x0)." 不是错误。它只是告诉您后台线程已退出。零表示线程已成功运行并退出。
异常在接收数据(对象obj)中,因为您应该能够告诉,给定异常,"接收数据中的错误:远程主机强行关闭了现有连接"。
如果您发布正在使用的客户端程序,我可能会提供帮助。
问题是 Main() 不会等待套接字完成其作业。一旦它创建了线程,它就存在...线程被破坏了。
您需要通过使用某种事件或睡眠,从 Main() 或 MyServer() 等待套接字处理线程,只要程序仅在整个作业完成后存在。