Когда я должен использовать UdpClient.BeginReceive? Когда я должен использовать UdpClient.Receive в фоновом потоке? - PullRequest
3 голосов
/ 19 апреля 2011

По сути, в чем различия между ними, помимо очевидного?Когда я должен использовать какую форму?

class What
{
    public Go()
    {
        Thread thread = new Thread(new ThreadStart(Go2));
        thread.Background = true;
        thread.Start();
    }
    private Go2()
    {
        using UdpClient client = new UdpClient(blabla)
        {
            while (stuff)
            {
                client.Receive(guh);
                DoStuff(guh);
            }
        }
    }
}

против

class Whut
{
    UdpClient client;
    public Go()
    {
        client = new UdpClient(blabla);
        client.BeginReceive(guh, new AsyncCallback(Go2), null);
    }
    private Go2(IAsyncResult ar)
    {
        client.EndReceive(guh, ar);
        DoStuff(guh);
        if (stuff) client.BeginReceive(guh, new AsyncCallback(Go2), null);
        else client.Close();
    }
}

1 Ответ

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

Я не думаю, что разница обычно будет огромной, но я бы предпочел полностью асинхронный подход (Begin ... / End ...), если я ожидаю паузы во входящем потоке, так что обратный вызов может быть выгружен несколько слоев, а не требуя дополнительной нити. Еще одним преимуществом асинхронного подхода является то, что вы всегда можете получить необходимые данные, поставить в очередь другую асинхронную выборку и затем обработать новые данные в существующем асинхронном потоке , предоставив еще несколько вариантов параллелизма (одно чтение, одна обработка). Конечно, это можно сделать и вручную (возможно, с использованием рабочей очереди).

Вы можете, конечно, профиль ...

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