Выйдите из TcpLIstener.AcceptTcpClient () через определенное время - PullRequest
0 голосов
/ 08 мая 2018

Я хочу, чтобы мой сервер прекратил прослушивание через минуту без запроса соединения. Проблема в том, что после команды AcceptTcpClient () он попадает в цикл без возможности остановить его. Есть вариант сделать это?

private static void Listen(TcpListener listener)
    {
        //Start listening
        listener.Start();
        Console.WriteLine("Waiting for a connection...\n");

        //Accept connection
        TcpClient client = listener.AcceptTcpClient();

        //Need to stop it after 1 minute.

        listener.Stop();
        //CHECK
        Console.WriteLine("Accepted the connection\n");

        ClientHandle(client);

    }

1 Ответ

0 голосов
/ 08 мая 2018

Есть несколько способов сделать это:

1) Асинхронное ожидание без блокировки потока:

private static async Task Listen(TcpListener listener)
{
    //Start listening
    listener.Start();
    Console.WriteLine("Waiting for a connection...\n");

    //Accept connection
    TcpClient client = listener.AcceptTcpClient();

    await Task.Delay(60000); // async wait for 1 minute

    listener.Stop();
    //CHECK
    Console.WriteLine("Accepted the connection\n");

    ClientHandle(client);
}

Не забудьте дождаться этого метода от звонящего:

await Listen(yourListener);

2) Использование Timer (System.Threading.Timer):

private static void Listen(TcpListener listener)
{        
    //Start listening
    listener.Start();

    var timerTimer = new Timer((state) => { listener.Stop(); }, null, 60000, Timeout.Infinite);

    Console.WriteLine("Waiting for a connection...\n");

    //Accept connection
    TcpClient client = listener.AcceptTcpClient();

    //CHECK
    Console.WriteLine("Accepted the connection\n");

    ClientHandle(client);
}

Вы также можете использовать любой другой таймер.

...