socket编程 动态Thread如何关闭

luhr 2014-11-23 08:54:28
目前的代码逻辑:动态创建带socket参数的Thread,开启线程连接socket并接受数据,
接受完数据立刻socket.Disconnet()并且Thread.Abord()
现在的问题是,动态创建的Thread无法关闭

/// 添加带socket参数的线程

private void AddCCDThread(ccd c)
{
Thread thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(Receive)) { IsBackground = true };
thread.Start(c);
}

Process current = Process.GetCurrentProcess();
void Receive(object p)
{
ccd client = (ccd)p;

IPAddress ipAdress = IPAddress.Parse(client.ip);
IPEndPoint endPoint = new IPEndPoint(ipAdress, Convert.ToInt32(client.port));//终结点
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

try
{
socket.Connect(endPoint);
}
catch
{
}
while(socket.Connected)
{
try
{
byte[] byteMsg = new byte[1024 * 1024 * 4];
int length = socket.Receive(byteMsg);
string strMsg = Encoding.Default.GetString(byteMsg, 0, length);

}
catch
{
}

socket.Disconnect(true);

}
//问题:断点根本不到if这里
if (System.Threading.Thread.CurrentThread.IsAlive)
{

System.Threading.Thread.CurrentThread.Abort();

}
...全文
197 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
luhr 2014-11-24
  • 打赏
  • 举报
回复
引用 8 楼 lovelj2012 的回复:
你的问题应该是,在Disconnect时,还有数据尚未接收,Disconnect起始处于阻塞状态,没有真正的断开
是的 我刚才调试发现 测试用的demo一直在循环发数据 感谢解答
luhr 2014-11-24
  • 打赏
  • 举报
回复
引用 1 楼 lovelj2012 的回复:
走不到if是没跳出while循环,还是走到if条件判断为false? 目测你表达是if条件判断时结果为false if的条件System.Threading.Thread.CurrentThread,CurrentThread虽然是新线程启动执行,这个线程未必就是新启的thread 如果是第一种,你确定下socket.Disconnect是否关闭了连接?不行就进行close
是没有关闭连接 感谢提供的思路 谢谢
luhr 2014-11-24
  • 打赏
  • 举报
回复
引用 2 楼 Forty2 的回复:
这是因为这行int length = socket.Receive(byteMsg);阻塞住线程,因此执行到不了后面的断点。 一种解决方法就是外部诱发socket.Receive中断。这里可以用socket.ShutDown来导致socket.Receive抛出异常,从而跳出阻塞: 1、把socket声明为成员变量(而不是定义在Receive函数内)。 2、想退出接收线程的时候,调用成员变量socket的socket.ShutDown和socket.Dispose。
感谢感谢!是阻塞了,用socket.ShutDown中断Socket.Receive解决问题了感谢各位热心解答
江南小鱼 2014-11-24
  • 打赏
  • 举报
回复
你的问题应该是,在Disconnect时,还有数据尚未接收,Disconnect起始处于阻塞状态,没有真正的断开
by_封爱 版主 2014-11-24
  • 打赏
  • 举报
回复
江南小鱼 2014-11-24
  • 打赏
  • 举报
回复
纠正 if的条件System.Threading.Thread.CurrentThread,CurrentThread虽然是新线程启动执行,这个线程未必就是新启的thread 仔细想了一下并验证,这句是谬论
xian_wwq 2014-11-24
  • 打赏
  • 举报
回复
在while逻辑中应该有数据接受完成的判定逻辑 即在接收完数据后进行逻辑判定,决定是否要继续接受。 如果不需要,break出while循环。 否则会阻塞在receive
於黾 2014-11-24
  • 打赏
  • 举报
回复
执行socket.Receive之前,设置一下readtimeout,让它没有收到数据的时候不要永远阻塞
於黾 2014-11-24
  • 打赏
  • 举报
回复
最好不用System.Threading.Thread.CurrentThread.Abort(); 而且你把代码写到了while循环的外面,如果socket.Connected一直是true,它根本就不会走到下面的代码里 而如果socket.Connected是false,根本不需要abort,它自己就走出方法,然后线程就自己结束了
Forty2 2014-11-24
  • 打赏
  • 举报
回复
这是因为这行int length = socket.Receive(byteMsg);阻塞住线程,因此执行到不了后面的断点。 一种解决方法就是外部诱发socket.Receive中断。这里可以用socket.ShutDown来导致socket.Receive抛出异常,从而跳出阻塞: 1、把socket声明为成员变量(而不是定义在Receive函数内)。 2、想退出接收线程的时候,调用成员变量socket的socket.ShutDown和socket.Dispose。
江南小鱼 2014-11-24
  • 打赏
  • 举报
回复
走不到if是没跳出while循环,还是走到if条件判断为false? 目测你表达是if条件判断时结果为false if的条件System.Threading.Thread.CurrentThread,CurrentThread虽然是新线程启动执行,这个线程未必就是新启的thread 如果是第一种,你确定下socket.Disconnect是否关闭了连接?不行就进行close

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧