背景
需要写一个TcpClient的数据监听。为了实现不间断监听,需要写一个无限循环的线程。后来又需要写一个带参数的函数线程,也列在此。
using System.Threading;
1. 不带参数的线程
1.1代码实现
private void ZQWLconnect()
{
//新建线程
Thread threadTCPClientListener = new Thread(TCPListening);
//启动线程
threadTCPClientListener.Start();
//随主窗体关闭
threadTCPClientListener.IsBackground = true;
}
private void TCPListening()
{
//新建TcpClient 并随后进行连接
TcpClient clientSocketZQWLPort01RTK = new TcpClient();
clientSocketZQWLPort01RTK.Connect("192.168.1.253", 1030);
NetworkStream serverStream = clientSocketZQWLPort01RTK.GetStream();
byte[] outStream = Encoding.ASCII.GetBytes("$");
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
byte[] inStream = new byte[10025];
while(true)
{
if(clientSocketZQWLPort01RTK.Available!=0)
{
serverStream.Read(inStream, 0, inStream.Length);
string returndata = System.Text.Encoding.ASCII.GetString(inStream);
Debug.WriteLine(returndata);
}
}
}
2.带参数的线程
2.1代码示例:
其中,TextBoxPCPort是一个文本控件。
private void MainForm_Load(object sender, EventArgs e)
{
Thread threadUDPlisting = new Thread(unused => UDPListener(IPAddress.Any, int.Parse( TextBoxPCPort.Text)));
threadUDPlisting.Start();
//随主窗体关闭
threadUDPlisting.IsBackground = true;
//UDPListener(IPAddress.Any, 80);
}
private void UDPListener(IPAddress address, int port)
{
UdpClient listener = new UdpClient(port);
IPEndPoint groupEP = new IPEndPoint(address, port);
try
{
while (true)
{
Console.WriteLine("Waiting for broadcast");
byte[] bytes = listener.Receive(ref groupEP);
Console.WriteLine($"Received broadcast from {groupEP} :");
Console.WriteLine($" {Encoding.ASCII.GetString(bytes, 0, bytes.Length)}");
}
}
catch (SocketException e)
{
Console.WriteLine(e);
}
finally
{
listener.Close();
}
}