TcpListener Timeout / about / something?没有ASync?

时间:2010-07-22 20:48:17

标签: .net sockets multithreading tcplistener

我创建了一个使用TcpListener的线程,当我的应用程序关闭时,我想让thead终止。我可以调用abort但由于TcpListener使用AcceptTcpClient进行阻塞,因此该线程仍处于活动状态。

是否可以约束或设置超时或使用AcceptTcpClient进行SOMETHING?我无法想象,如果没有办法阻止它永远阻止它会如何有用。我的代码是串行的,我希望它保持这种方式,所以有没有使用BeginAcceptTcpClient的解决方案?并编写ASync代码?

3 个答案:

答案 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()上进行。