Подтвердить что ты не робот

Есть ли разница в производительности между Begin * и * Async для сокетов в .NET?

Мое приложение должно быстро передавать сообщение большому числу клиентов (1000-х) и собирать результаты.

Я думаю, следует ли использовать BeginSend/EndSend семейство функций или использовать семейство SendAsync - есть ли разница в производительности? В чем их отличие вообще, кроме семейства * Async, не требующего выделения IAsyncResult?

Если я правильно понимаю, они оба используют порты завершения ввода-вывода и стандартный пул потоков .net. Итак, какая разница?

4b9b3361

Ответ 1

Разница заключается только в используемом шаблоне.

SendAsync в фактах используется шаблон, основанный на событиях. BeginSend и EndSend используйте шаблон IAsyncResult.

EDIT: Я не знаю, как интерфейс IAsyncResult реализован в классе Socket, но вот document из MSDN, который объясняет, когда следует реализовать один шаблон или другой.

Выдержка из последней части:

В то время как асинхронный шаблон на основе событий имеет много преимуществ в ранее упомянутых сценариев имеет некоторые недостатки, которые вы должны быть осведомлены о том, ваше самое важное требование.

Существует три сценария: шаблон, основанный на событиях, не адресует а также шаблон IAsyncResult:

  • Блокировка ожидания на одном IAsyncResult

  • Блокировка ожидания многих объектов IAsyncResult

  • Опрос для завершения на IAsyncResult

Вы можете решить эти сценарии используя шаблон, основанный на событиях, но сделать это более громоздко, чем использовать шаблон IAsyncResult.

Разработчики часто используют IAsyncResult шаблон для служб, которые обычно имеют очень высокую производительность требования. Например, фотограф для сценария завершения высокопроизводительная серверная техника.

Кроме того, шаблон на основе событий менее эффективен, чем Шаблон IAsyncResult, потому что он создает больше объектов, особенно EventArgs, и поскольку он синхронизирует через потоки.

В следующем списке показаны некоторые рекомендации следовать, если вы решите использовать IAsyncResult шаблон:

  • Выделите шаблон IAsyncResult только в случае необходимости поддержка WaitHandle или IAsyncResult объекты.

  • Выставлять шаблон IAsyncResult только при наличии существующего API который использует шаблон IAsyncResult.

  • Если у вас есть существующий API на основе шаблона IAsyncResult, рассмотрите также подвергая шаблону, основанному на событиях в следующем выпуске.

  • Выдавайте только шаблон IAsyncResult, если у вас высокая производительность требования, которые вы подтвердили не могут быть выполнены на основе событий но может быть удовлетворена Шаблон IAsyncResult.