我创建了一个使用TcpListener的线程,当我的应用程序关闭时,我想让thead终止。我可以调用abort但由于TcpListener使用AcceptTcpClient进行阻塞,因此该线程仍处于活动状态。
是否可以约束或设置超时或使用AcceptTcpClient进行SOMETHING?我无法想象,如果没有办法阻止它永远阻止它会如何有用。我的代码是串行的,我希望它保持这种方式,所以有没有使用BeginAcceptTcpClient的解决方案?并编写ASync代码?
答案 0 :(得分:12)
简单的解决方案。检查待处理。
while(!server.Pending())
{
Thread.Sleep(10);
}
TcpClient client = server.AcceptTcpClient();
答案 1 :(得分:4)
您可以将对AcceptTcpClient的调用替换为Socket.Select(),这可能会超时。
var sockl = new ArrayList { listener.Server };
Socket.Select(sockl, null, null, _timeout_);
if (sockl.Contains(listener.Server)) listener.AcceptTcpClient();
答案 2 :(得分:3)
我在AcceptTcpClient()
循环中使用while(!Disposing)
来接受我的客户
当我处理课程时,我会调用Stop()
的{{1}}函数并将TcpListener
设置为true;像这样:
Disposing
请注意,这只是服务器类的一小段摘录......
这样,程序可以保持锁定public class Server : IDisposable
{
private TcpListener _tcpListener;
private bool _isDisposing;
public void Start()
{
(new Thread(new ThreadStart(ListenForClients))).Start();
}
private void ListenForClients()
{
this._tcpListener = new TcpListener(System.Net.IPAddress.Any, this.ListenPort);
this._tcpListener.Start();
while (!_isDisposing)
{
//blocks until a client has connected to the server
TcpClient client = this._tcpListener.AcceptTcpClient();
if (client == null) continue;
//create a thread to handle communication with connected client
}
}
public void Dispose()
{
this._isDisposing = true;
this._tcpListener.Stop();
}
}
功能,但仍然可以结束
但是,听取本身也必须在单独的AcceptTcpClient()
上进行。