我将此代码放在一个单独的线程(Task)中,该线程在应用程序启动时首先运行,并且在应用程序关闭之前不应该结束:
TcpListener tcpListener = new TcpListener(IPAddress.Any, port);
tcpListener.Start();
while (true)
{
TcpClient client = tcpListener.AcceptTcpClient();
Task.Factory.StartNew(HandleClientCommunication, client);
}
在这种情况下,是否需要致电tcpListener.Stop()
?这个线程在应用程序的整个持续时间内运行,如果我确实需要调用它,我会在哪里这样做?侦听器是此线程的本地。我没有while (true)
循环,而是在FormClosing事件中设置while (appRunning)
循环并将appRunning设置为false?然后在while循环之后我可以调用tcpListener.Stop()
。
但是,是否甚至需要调用TcpListener.Stop()
,因为应用程序已经关闭,因为我正在使用任务,所以流程也会结束?
答案 0 :(得分:2)
尝试类似的东西:
public class Listener
{
private readonly TcpListener m_Listener = new TcpListener(IPAddress.Any, IPEndPoint.MinPort);
private CancellationTokenSource m_Cts;
private Thread m_Thread;
private readonly object m_SyncObject = new object();
public void Start()
{
lock (m_SyncObject){
if (m_Thread == null || !m_Thread.IsAlive){
m_Cts = new CancellationTokenSource();
m_Thread = new Thread(() => Listen(m_Cts.Token))
{
IsBackground = true
};
m_Thread.Start();
}
}
}
public void Stop()
{
lock (m_SyncObject){
m_Cts.Cancel();
m_Listener.Stop();
}
}
private void Listen(CancellationToken token)
{
m_Listener.Start();
while (!token.IsCancellationRequested)
{
try{
var socket = m_Listener.AcceptSocket();
//do something with socket
}
catch (SocketException){
}
}
}
}
使用TcpListener.Pending()
的方法并不是很好,因为你必须使用Thread.Sleep(miliseconds)
或类似的东西 - 客户端接受之间会有一些延迟(睡眠中的毫秒数),这很糟糕。