Когда я должен использовать UdpClient.BeginReceive? Когда я должен использовать UdpClient.Receive в фоновом потоке?

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

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 ответ

Решение

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

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

Другие вопросы по тегам