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

#.net #asynchronous #begininvoke #asynccallback

#.net #асинхронный #begininvoke #обратный вызов asynccallback

Вопрос:

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

 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 …), если я ожидаю пауз во входящем потоке, чтобы обратный вызов можно было разгрузить на несколько уровней, а не требовать дополнительного потока. Другим преимуществом асинхронного подхода является то, что вы всегда можете получить нужные вам данные, поставить в очередь другую асинхронную выборку, а затем обработать новые данные в существующем асинхронном потоке, предоставляя еще несколько вариантов параллелизма (одно чтение, одна обработка). Это, конечно, тоже можно сделать вручную (возможно, используя рабочую очередь).

Вы, конечно, могли бы создать профиль…