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