socket编程 动态Thread怎么关闭
socket编程 动态Thread如何关闭
目前的代码逻辑:动态创建带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();
}
------解决思路----------------------
走不到if是没跳出while循环,还是走到if条件判断为false?
目测你表达是if条件判断时结果为false
if的条件System.Threading.Thread.CurrentThread,CurrentThread虽然是新线程启动执行,这个线程未必就是新启的thread
如果是第一种,你确定下socket.Disconnect是否关闭了连接?不行就进行close
------解决思路----------------------
这是因为这行int length = socket.Receive(byteMsg);阻塞住线程,因此执行到不了后面的断点。
一种解决方法就是外部诱发socket.Receive中断。这里可以用socket.ShutDown来导致socket.Receive抛出异常,从而跳出阻塞:
1、把socket声明为成员变量(而不是定义在Receive函数内)。
2、想退出接收线程的时候,调用成员变量socket的socket.ShutDown和socket.Dispose。
------解决思路----------------------
执行socket.Receive之前,设置一下readtimeout,让它没有收到数据的时候不要永远阻塞
------解决思路----------------------
在while逻辑中应该有数据接受完成的判定逻辑
即在接收完数据后进行逻辑判定,决定是否要继续接受。
如果不需要,break出while循环。
否则会阻塞在receive
目前的代码逻辑:动态创建带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();
}
------解决思路----------------------
走不到if是没跳出while循环,还是走到if条件判断为false?
目测你表达是if条件判断时结果为false
if的条件System.Threading.Thread.CurrentThread,CurrentThread虽然是新线程启动执行,这个线程未必就是新启的thread
如果是第一种,你确定下socket.Disconnect是否关闭了连接?不行就进行close
------解决思路----------------------
这是因为这行int length = socket.Receive(byteMsg);阻塞住线程,因此执行到不了后面的断点。
一种解决方法就是外部诱发socket.Receive中断。这里可以用socket.ShutDown来导致socket.Receive抛出异常,从而跳出阻塞:
1、把socket声明为成员变量(而不是定义在Receive函数内)。
2、想退出接收线程的时候,调用成员变量socket的socket.ShutDown和socket.Dispose。
------解决思路----------------------
执行socket.Receive之前,设置一下readtimeout,让它没有收到数据的时候不要永远阻塞
------解决思路----------------------
在while逻辑中应该有数据接受完成的判定逻辑
即在接收完数据后进行逻辑判定,决定是否要继续接受。
如果不需要,break出while循环。
否则会阻塞在receive