public void TcpThread()
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
ReceIpEp = new IPEndPoint(ipAddress, this.port);
socket.Bind(ReceIpEp);
socket.Listen(0);
while (true)
{
Socket connection = socket.Accept();
CConnection conn = new CConnection(connection);
gpsConnection.Frmgps = this.frmgps;
Thread thread = new Thread(new ThreadStart(gpsConnection.WaitForSendData));
thread.Name = connection.RemoteEndPoint.ToString();
thread.Start();
}
}
以上的线程函数在一个类中,用于接收TCP连接。CConnection类用于每一个TCP连接的数据收发,
并且每一个TCP连接都专门开启一个线程。
Class CConnection
{
private Socket connSocket public void CConnection(Socket conn)
{
this.connSocket=conn
}
public void WaitForSendData()
{
while (true)
{
bytes = new byte[1024];
this.connSocket.Blocking = true;
int bytesLength = this.connSocket.Receive(bytes);
........
}
}
}现在的问题是,,每次连接来的时候创建CConnection conn对象传入Socket,并开起一个线程。
1,每次创建CConnection conn会不会覆盖之前创建的CConnection conn对象?不
2,每个线程,public void WaitForSendData()访问的是同一个对象引用么?
3,这种情况下需要同步么,如何同步?
4,CConnection类中还有很多其他字段,那么每个线程访问的是不同的对象的字段还是同一个对象的字段?问题问的很乱,因为对于这块的理解很乱,希望大家能够看的明白。。也希望能让我也明白
不晓得这个算不算是对同一代码块的访问,,但是每个线程都在不同的对象中。。
{
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
ReceIpEp = new IPEndPoint(ipAddress, this.port);
socket.Bind(ReceIpEp);
socket.Listen(0);
while (true)
{
Socket connection = socket.Accept();
CConnection conn = new CConnection(connection);
gpsConnection.Frmgps = this.frmgps;
Thread thread = new Thread(new ThreadStart(gpsConnection.WaitForSendData));
thread.Name = connection.RemoteEndPoint.ToString();
thread.Start();
}
}
以上的线程函数在一个类中,用于接收TCP连接。CConnection类用于每一个TCP连接的数据收发,
并且每一个TCP连接都专门开启一个线程。
Class CConnection
{
private Socket connSocket public void CConnection(Socket conn)
{
this.connSocket=conn
}
public void WaitForSendData()
{
while (true)
{
bytes = new byte[1024];
this.connSocket.Blocking = true;
int bytesLength = this.connSocket.Receive(bytes);
........
}
}
}现在的问题是,,每次连接来的时候创建CConnection conn对象传入Socket,并开起一个线程。
1,每次创建CConnection conn会不会覆盖之前创建的CConnection conn对象?不
2,每个线程,public void WaitForSendData()访问的是同一个对象引用么?
3,这种情况下需要同步么,如何同步?
4,CConnection类中还有很多其他字段,那么每个线程访问的是不同的对象的字段还是同一个对象的字段?问题问的很乱,因为对于这块的理解很乱,希望大家能够看的明白。。也希望能让我也明白
不晓得这个算不算是对同一代码块的访问,,但是每个线程都在不同的对象中。。
Thread thread = new Thread(new ThreadStart(gpsConnection.WaitForSendData));
这部分代码不应该这么写,你这样运行了一个新的线程,却没有捕获这个thread,会导致程序退出进程仍就运行,运行的是你的后台线程。如果要用Thread,你必须在程序退出前终止所有的Thread。所以你应该用ThreadPool,或者你可以使用socket.BeginAccept来创建系统默认的ThreadPool来异步执行。
ThreadPool是一个比较好的解决方案, 我现在也用TheadPool, 效果不错.
上面的代码只是一个测试代码。我现在的设计上就是使用的同步方式,TCP的连接数可能会达到50-100,所以也会同时创建这么多的线程。关于管理这些线程,我是这么想的,在创建线程的时候,可以将线程ID和Socket
绑定,在Socket连接断开的时候,释放该线程的所有资源。至于程序退出,简单点直接KIll掉进程。像你所说的,终止所有线程后退出也可以。现在有个问题向你请教,,可以根据Thread.Name来终止线程吗,不能的话,,在程序退出时,或Socket断开连接,,有什么好的方式退出线程,释资源。