LS的朋友说的对,用异步接受是关键,不要自己创建线程去接受.一下是Socket 异步接受的一个例子和它的关键代码: public void SetupRecieveCallback( Socket sock ) { try { AsyncCallback recieveData = new AsyncCallback( OnRecievedData ); sock.BeginReceive( m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock ); } catch( Exception ex ) { MessageBox.Show( this, ex.Message, "Setup Recieve Callback failed!" ); } }public void OnRecievedData( IAsyncResult ar ) { // Socket was the passed in object Socket sock = (Socket)ar.AsyncState; // Check if we got any data try { int nBytesRec = sock.EndReceive( ar ); if( nBytesRec > 0 ) { // Wrote the data to the List string sRecieved = Encoding.ASCII.GetString( m_byBuff, 0, nBytesRec ); // WARNING : The following line is NOT thread safe. Invoke is // m_lbRecievedData.Items.Add( sRecieved ); Invoke( m_AddMessage, new string [] { sRecieved } ); // If the connection is still usable restablish the callback SetupRecieveCallback( sock ); } else { // If no data was recieved then the connection is probably dead Console.WriteLine( "Client {0}, disconnected", sock.RemoteEndPoint ); sock.Shutdown( SocketShutdown.Both ); sock.Close(); } } catch( Exception ex ) { MessageBox.Show( this, ex.Message, "Unusual error druing Recieve!" ); } }给你个8错的文章,是E文,带源代码(上边的代码是其中一部分):http://www.codeproject.com/cs/internet/socketsincs.asp异步功能还有一个好处是.NET底层的Socket类库在你用异步时可以聪明到最大限度地利用通讯硬件上的线程和资源,对节省CPU资源很有帮助.
专注于自动提交、发贴机、资源采集器等网络营销软件的开发及相关领域如验证码识别技术。
QQ群号:24733057
while(信号量)
{
...
udpClient.receive();
...
}
关键是B一直在receive(),如果想马上结束B的话,通过信号量是不行的
public void SetupRecieveCallback( Socket sock )
{
try
{
AsyncCallback recieveData = new AsyncCallback( OnRecievedData );
sock.BeginReceive( m_byBuff, 0, m_byBuff.Length,
SocketFlags.None, recieveData, sock );
}
catch( Exception ex )
{
MessageBox.Show( this, ex.Message, "Setup Recieve Callback failed!" );
}
}public void OnRecievedData( IAsyncResult ar )
{
// Socket was the passed in object
Socket sock = (Socket)ar.AsyncState; // Check if we got any data
try
{
int nBytesRec = sock.EndReceive( ar );
if( nBytesRec > 0 )
{
// Wrote the data to the List
string sRecieved = Encoding.ASCII.GetString( m_byBuff,
0, nBytesRec ); // WARNING : The following line is NOT thread safe. Invoke is
// m_lbRecievedData.Items.Add( sRecieved );
Invoke( m_AddMessage, new string [] { sRecieved } ); // If the connection is still usable restablish the callback
SetupRecieveCallback( sock );
}
else
{
// If no data was recieved then the connection is probably dead
Console.WriteLine( "Client {0}, disconnected",
sock.RemoteEndPoint );
sock.Shutdown( SocketShutdown.Both );
sock.Close();
}
}
catch( Exception ex )
{
MessageBox.Show( this, ex.Message, "Unusual error druing Recieve!" );
}
}给你个8错的文章,是E文,带源代码(上边的代码是其中一部分):http://www.codeproject.com/cs/internet/socketsincs.asp异步功能还有一个好处是.NET底层的Socket类库在你用异步时可以聪明到最大限度地利用通讯硬件上的线程和资源,对节省CPU资源很有帮助.