Тайм-аут TcpListener / о / что-то?Без ASync? - PullRequest
4 голосов
/ 23 июля 2010

Я создаю поток, который использует TcpListener, и когда мое приложение закрывается, я бы хотел, чтобы thead завершился. Я могу вызвать abort, но поток все еще жив, поскольку TcpListener блокируется с помощью AcceptTcpClient.

Возможно ли установить или установить таймаут или сделать что-то с AcceptTcpClient? Я не могу себе представить, как это было бы полезно, если бы не было способа остановить его навсегда. Мой код является последовательным, и я хотел бы, чтобы он остался таким, поэтому есть ли решение без использования BeginAcceptTcpClient? и писать код ASync?

Ответы [ 3 ]

12 голосов
/ 23 июля 2010

Простое решение.ПРОВЕРЬТЕ в ожидании.

while(!server.Pending())
{
    Thread.Sleep(10);
}
TcpClient client = server.AcceptTcpClient();
4 голосов
/ 23 июля 2010

Вы можете заменить вызов AcceptTcpClient на вызов Socket.Select (), который может быть остановлен.

var sockl = new ArrayList { listener.Server };
Socket.Select(sockl, null, null, _timeout_);
if (sockl.Contains(listener.Server)) listener.AcceptTcpClient();
3 голосов
/ 26 сентября 2012

Я использую AcceptTcpClient() в цикле while(!Disposing), чтобы принимать своих клиентов.
Когда я располагаю Class, я вызываю функцию Stop() TcpListener и устанавливаю Disposing в true; как это:

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() и по-прежнему завершаться.
Однако само прослушивание также должно происходить в отдельном Thread (Start() function).

...