C# Form 线程错误 正在中止线程
答案:3 悬赏:50 手机版
解决时间 2021-04-26 21:31
- 提问者网友:萌卜娃娃
- 2021-04-26 09:24
C# Form 线程错误 正在中止线程
最佳答案
- 五星知识达人网友:躲不过心动
- 2021-04-26 09:52
您好,
如果方便,请补充一下Lis方法的代码,我感觉错误应该是出在这里。
谢谢。
====================================
您好,
看过Lis代码,有些明白。
建议您从这个方向考虑一下:
线程Start后,会异步执行Lis方法,此时如果没有Client连接,则Socket应该处于StandBy状态也就是它会挂起当前线程以等待连接。而此时您About了线程,而线程正忙着监听,所以……自然会出现异常,但这个异常只不过是线程结束缓慢而已,并不属于严重或致命错误,如果您取消Try块,很可能此错误不会被IDE捕获。
我想大概是这个原因,您可以尝试写个方法在退出线程前把Socket Shutdown掉试试,如果没有异常,那问题就是出在这里了。
谢谢。
如果方便,请补充一下Lis方法的代码,我感觉错误应该是出在这里。
谢谢。
====================================
您好,
看过Lis代码,有些明白。
建议您从这个方向考虑一下:
线程Start后,会异步执行Lis方法,此时如果没有Client连接,则Socket应该处于StandBy状态也就是它会挂起当前线程以等待连接。而此时您About了线程,而线程正忙着监听,所以……自然会出现异常,但这个异常只不过是线程结束缓慢而已,并不属于严重或致命错误,如果您取消Try块,很可能此错误不会被IDE捕获。
我想大概是这个原因,您可以尝试写个方法在退出线程前把Socket Shutdown掉试试,如果没有异常,那问题就是出在这里了。
谢谢。
全部回答
- 1楼网友:狂恋
- 2021-04-26 10:50
百度的问题补充字数有限,所以再申请了个号..
下面这些我测试是可以的,不过,就是在Lis()里把所有代码 加上catch后不行
有些时候,就出现 正在中止线程,,
调试时,我在进入Lis()时设断点,它会卡住很久,才有反映..
前些时候,这个程序没有出现这个问题,,
代码如下:
S端:
////客户端节点
private IPEndPoint client;
////服务器端Socket
private Socket server;
////服务器端监听线程
private Thread thdSvr;
////网络数据流
NetworkStream stream;
////写数据流
TextWriter writer;
////读数据流
TextReader reader;
private void Lis(){
client = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 34567);
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Blocking = true;
server.Bind(client);
server.Listen(0);
while (true)
{
Socket t = server.Accept();
if (t != null)
{
stream = new NetworkStream(t);
writer = new StreamWriter(stream);
reader = new StreamReader(stream);
this.richTextBox1.Text += "接收到一个连接。。。\n";
writer.WriteLine("欢迎连接到服务器!");
writer.Flush();
writer.WriteLine("你现在可以说话了");
writer.Flush();
string str = reader.ReadLine();
if (str == "你好,服务器,很高兴能和你通讯,谢谢。")
{
this.richTextBox1.Text += str;
this.richTextBox1.Text += "\n";
}
label1.Text = ((IPEndPoint)t.RemoteEndPoint).Address.ToString();//获得客户IP
reader.Close();
writer.Close();
stream.Close();
t.Close();
}
}
}
在C端:
////客户端节点
private IPEndPoint client;
////服务器端Socket
private Socket server;
////服务器端监听线程
private Thread thdSvr;
////网络数据流
NetworkStream stream;
////写数据流
TextWriter writer;
////读数据流
TextReader reader;
//连接服务器
private void button1_Click(object sender, EventArgs e)
{
//服务器IP地址
serIP = IPAddress.Parse("127.0.0.1");
server = new IPEndPoint(serIP, 34567);
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(server);
if (client.Connected)
{
stream = new NetworkStream(client);
writer = new StreamWriter(stream);
reader = new StreamReader(stream);
richTextBox1.Text += "连接到服务器。。。\n";
richTextBox1.Text += reader.ReadLine();
richTextBox1.Text += reader.ReadLine();
richTextBox1.Text += "\n";
writer.WriteLine("你好,服务器,很高兴能和你通讯,谢谢。"); //stream.Read(byyybuffer, intoffest, intsize);
writer.Flush();
reader.Close();
writer.Close();
stream.Close();
client.Close();
}
}
谢谢两位!!!!
====================================
答 david_zha0:
谢谢!,我也发现了可能是因为中断线程而产生的Exception,我发现我写的的线程中止都会有这个问题,它的错误信息是"正在中止线程.",,所以这可能也不是个问题..
您说的,,用Shutdown,我试过,在停止线程前作用.但出错的,,其实,我想和这个没关系,因为Shutdown应该是指,在通信还未断开前使用的.如果断开连接,那这方法的使用就会引发异常了.而我的通信只一次交互(读与写)即关闭连接,应该是不能用Shutdown的.
不知道对不对,,谢谢了,,
下面这些我测试是可以的,不过,就是在Lis()里把所有代码 加上catch后不行
有些时候,就出现 正在中止线程,,
调试时,我在进入Lis()时设断点,它会卡住很久,才有反映..
前些时候,这个程序没有出现这个问题,,
代码如下:
S端:
////客户端节点
private IPEndPoint client;
////服务器端Socket
private Socket server;
////服务器端监听线程
private Thread thdSvr;
////网络数据流
NetworkStream stream;
////写数据流
TextWriter writer;
////读数据流
TextReader reader;
private void Lis(){
client = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 34567);
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Blocking = true;
server.Bind(client);
server.Listen(0);
while (true)
{
Socket t = server.Accept();
if (t != null)
{
stream = new NetworkStream(t);
writer = new StreamWriter(stream);
reader = new StreamReader(stream);
this.richTextBox1.Text += "接收到一个连接。。。\n";
writer.WriteLine("欢迎连接到服务器!");
writer.Flush();
writer.WriteLine("你现在可以说话了");
writer.Flush();
string str = reader.ReadLine();
if (str == "你好,服务器,很高兴能和你通讯,谢谢。")
{
this.richTextBox1.Text += str;
this.richTextBox1.Text += "\n";
}
label1.Text = ((IPEndPoint)t.RemoteEndPoint).Address.ToString();//获得客户IP
reader.Close();
writer.Close();
stream.Close();
t.Close();
}
}
}
在C端:
////客户端节点
private IPEndPoint client;
////服务器端Socket
private Socket server;
////服务器端监听线程
private Thread thdSvr;
////网络数据流
NetworkStream stream;
////写数据流
TextWriter writer;
////读数据流
TextReader reader;
//连接服务器
private void button1_Click(object sender, EventArgs e)
{
//服务器IP地址
serIP = IPAddress.Parse("127.0.0.1");
server = new IPEndPoint(serIP, 34567);
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(server);
if (client.Connected)
{
stream = new NetworkStream(client);
writer = new StreamWriter(stream);
reader = new StreamReader(stream);
richTextBox1.Text += "连接到服务器。。。\n";
richTextBox1.Text += reader.ReadLine();
richTextBox1.Text += reader.ReadLine();
richTextBox1.Text += "\n";
writer.WriteLine("你好,服务器,很高兴能和你通讯,谢谢。"); //stream.Read(byyybuffer, intoffest, intsize);
writer.Flush();
reader.Close();
writer.Close();
stream.Close();
client.Close();
}
}
谢谢两位!!!!
====================================
答 david_zha0:
谢谢!,我也发现了可能是因为中断线程而产生的Exception,我发现我写的的线程中止都会有这个问题,它的错误信息是"正在中止线程.",,所以这可能也不是个问题..
您说的,,用Shutdown,我试过,在停止线程前作用.但出错的,,其实,我想和这个没关系,因为Shutdown应该是指,在通信还未断开前使用的.如果断开连接,那这方法的使用就会引发异常了.而我的通信只一次交互(读与写)即关闭连接,应该是不能用Shutdown的.
不知道对不对,,谢谢了,,
- 2楼网友:毛毛
- 2021-04-26 10:25
应该是你的网络流还没有关闭的原因,我以前遇上过这样的问题,在关闭线程之前,必须要先保证流已经全部关闭。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯