Естественно, BeginReceive() никогда не закончится, если нет данных.
MSDN предлагает, что вызов Close() отменяет BeginReceive().
Однако вызов Close() в сокете также выполняет на нем Dispose(), как это было показано в этом замечательном ansewr, и, следовательно, EndReceive() будет бросать исключение, потому что объект уже расположен (и он делает!).
Как мне следует продолжить?