Вы можете обнаружить, что тайм-аут на самом деле работает, но поток зависает при попытке закрыть поток.Я не знаю, почему это происходит, но иногда это происходит.Я никогда не использовал ReadToEnd
, но я сталкивался с этим при использовании Read
.
Я исправил проблему, вызвав Abort
в запросе, прежде чем закрыть поток.Это немного круто, но это эффективно.Сокращенный код ниже показывает технику.
HttpWebResponse response = null;
StreamReader sr = null;
try
{
response = (HttpWebResponse)request.GetResponse(...);
Stream s = response.GetResponseStream();
sr = new StreamReader(s, Encoding.UTF8);
// do your reading here
}
finally
{
request.Abort(); // !! Yes, abort the request
if (sr != null)
sr.Dispose();
if (response != null)
response.Close();
}
Я обнаружил, что ReadTimeout
и ReadWriteTimeout
работают как положено.То есть, когда время чтения истекло, выполнение действительно переходит в блок finally
.А если request.Abort
нет, звонок на sr.Dispose
будет зависать.