背景
需要寫一個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();
}
}