Можете ли вы поместиться для вызова этого метода:
await Task.Factory.StartNew(
() => { /* to do what you need */ },
CancellationToken.None, /* you can change as you need */
TaskCreationOptions.None, /* you can change as you need */
customScheduler);
Вам нужно проверить заголовок длины содержимого, возвращаемый сервером. Прочтите только это количество байтов, а затем закройте соединение после этого.
Вы ждете, пока сервер закроет соединение, поэтому это занимает 20 секунд.
я могу бросить прерывание в блоке catch после чтения
readLine ожидает новой строки, которую сервер никогда не отправляет
Действие (пере) закрашивания экрана выполняется тем же потоком, который отвечает за чтение содержимого объекта чтения. Это классический пример использования многопоточности, чтобы на рендеринг экрана не влиял процесс чтения ответа.
РЕДАКТИРОВАТЬ: На основании полученных комментариев поведение можно объяснить тем фактом, что и клиент, и сервер должны выполнять операции очистки, когда сокет внезапно закрывается. Проще говоря, клиент, похоже, не читает все данные из входного потока, и, следовательно, для JVM и, следовательно, ОС требуется гораздо больше времени, чем обычно, для выполнения соответствующих операций, которые фактически освобождают ресурсы, что приводит к очевидной блокировке. некоторого разнообразия. Так что совет, предоставленный другими по использованию URL / URLConnection, в этом случае очень актуален.