Я пытаюсь понять, как это работает.Понимание асинхронного HttpWebRequest
HttpWebRequest
имеет способ BeginGetResponse
, который принимает в качестве параметра a ResponseCallback
. Во-первых, этот обратный вызов вызвал сразу (в новом потоке) или после получения ответа с сервера? Или это задача EndGetResponse
ждать ответа?
Во-вторых, как только вы получите ответ, вы можете получить доступ к потоку ответов немедленно, но поток не содержит полную страницу, пока не завершит загрузку, следовательно BeginRead
. Тем не менее, я, похоже, могу сразу получить доступ ко всем заголовкам через такие свойства, как HttpWebResponse.ContentLength
. Означает ли это, что EndGetResponse
не заполняется до тех пор, пока заголовки не будут полностью загружены, или это когда вы вызываете параметр ContentLength
, он зависает бит до тех пор, пока этот заголовок не будет принят?
Итак, вы думаете, что ResponseCallback не вызывается до загрузки заголовков? Справедливо. Вы знаете, как проверить, был ли он отменен, или это единственный способ проверить исключение, вызванное «EndGetResponse»? – mpen
Если вы не реализуете способ отмены этой операции, я бы не знал, как этот конкретный метод можно остановить - он работает как операция на ThreadPool, и вы ни пользователь, ни пользователь не можете остановить его сейчас. Общая схема позволяет лучше отменить механизм, хотя, расширив контракт. Например, WebClient делает это и позволяет вам подписаться на события, которые получают экземпляр AsyncCompletedEventArgs, которые снова предоставляют свойство .Cancelled. Это чистый материал, основанный на приведенном выше шаблоне. –
На самом деле это можно легко остановить: 'ThreadPool.RegisterWaitForSingleObject (asyncResult.AsyncWaitHandle, TimeoutCallback, conn, TimeOutInterval, true);' Я полагаю, что я мог бы добавить свое собственное свойство «Отказано», пока я нахожусь в нем. 'WebClient' не совсем делает то, что я хочу, поэтому я перестраиваю его, чтобы быть немного более гибким и поддерживать несколько одновременных загрузок. – mpen