Когда вы вызываете GetResponse, даже если вы вызываете его в фоновом потоке ThreadPool, этот поток все равно будет заблокирован и не сможет выполнять другую работу. Это означает переключение контекста и т. Д. Если, однако, вы используете BeginGetResponse, то он переносит работу на сетевую карту, однако, что наиболее важно, вызывающий поток теперь может свободно выполнять и выполнять какую-то другую работу. Когда сетевая карта будет готова, она уведомит ваше приложение, после чего будет вызван обратный вызов.