C # Обработка потоков и блокировка сокетов - PullRequest
1 голос
/ 03 апреля 2011

В следующем потоке UDP-пакеты читаются с клиентов, пока в логическом поле Run не будет установлено значение false.

Если для параметра Run задано значение false, когда метод приема блокируется, он остается заблокированным навсегда (есликлиент отправляет данные, которые сделают цикл потока и снова проверит условие Run).

while (Run)
{
    IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
    byte[] data = udpClient.Receive(ref remoteEndPoint); // blocking method

    // process received data
}

Обычно я решаю проблему, устанавливая тайм-аут на сервере.Это работает нормально, но мне кажется, что это неоднозначное решение.

udpClient.Client.ReceiveTimeout = 5000;

while (Run)
{
    try
    {
        IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
        byte[] data = udpClient.Receive(ref remoteEndPoint); // blocking method

        // process received data
    }
    catch(SocketException ex) {} // timeout reached
}

Как бы вы справились с этой проблемой?Есть ли лучший способ?

Ответы [ 2 ]

4 голосов
/ 03 апреля 2011

Используйте UdpClient.Close ().Это прекратит блокирующий вызов Receive ().Будьте готовы перехватить ObjectDisposedException, он сообщает вашему потоку, что сокет закрыт.

1 голос
/ 03 апреля 2011

Вы можете сделать что-то вроде этого:

private bool run;
public bool Run
{
    get
    {
        return run;
    }

    set
    {
        run = value;
        if(!run) 
        {
            udpClient.Close();
        }

    }   
}

Это позволяет вам закрыть клиент, как только будет выполнено любое условие, чтобы прекратить прослушивание вашего соединения.Вероятно, будет сгенерировано исключение, но я не верю, что это будет SocketTimeoutException, поэтому вам придется с этим справиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...