2015-08-12 3 views
1

У меня есть поток, который периодически запускается каждые 60 секунд. Этот поток получает ответ от веб-url. Все нормально до третьего запуска. Он больше не работает и показывает эту ошибку:Ошибка при выходе из GetResponse() в третьем запуске

«Операция истекла»

Это мой код и ошибки нашли на линии 5. Спасибо!

string sURL; 
sURL = "http://www.something.com"; 
WebRequest wrGETURL; 

wrGETURL = WebRequest.Create(sURL); 
HttpWebResponse http = (HttpWebResponse)wrGETURL.GetResponse(); 

Stream objStream = null; 
objStream = http.GetResponseStream(); 
+1

Возможно, вам захочется проверить, реализует ли какой-либо из этих объектов интерфейс 'IDisposable'. Если это так, вызовите метод Dispose. (особенно wrGETURL, будьте осторожны с потоками, их не следует закрывать до завершения соединения.) – Stefan

+0

Спасибо! но не могли бы вы рассказать мне, как я могу это сделать? Я новичок в C# – Neo

+0

Я добавляю строку http.dispose(); в конце функции и работает хорошо. Еще раз спасибо! – Neo

ответ

0

Вы можете рассмотреть вопрос об использовании using заявления:

string sURL; 
sURL = "http://www.something.com"; 

using (WebRequest wrGETURL = WebRequest.Create(sURL)) 
{ 
    using (HttpWebResponse http = (HttpWebResponse)wrGETURL.GetResponse()) 
    { 
     Stream objStream = http.GetResponseStream(); 

     //etc. 
    } 
} 

гарантирует, что метод Dispose называется, даже в случае возникновения исключения. (https://msdn.microsoft.com/en-us/library/yh598w02.aspx)

Причина таймаута, вероятно, заключается в том, что ваш сервер имеет ограничение на одновременные запросы x. Из-за неправильного воздействия соединение будет оставаться открытым дольше, чем необходимо. И хотя сборщик мусора исправит это для вас, это время слишком часто.

Именно поэтому я всегда рекомендую позвонить Dispose, через using для всех объектов, которые реализуют IDisposable. Это особенно актуально, если вы используете эти объекты в циклах или системах с низкой памятью (low resource).

Осторожно с потоками, они, как правило, используют узор декоратора и могут называть Dispose на всех своих «дочерних» объектах.

Обычно применяется для:

  • Графические объекты
  • соединения с базами данных
  • TCP/IP (HTTP и т.д.) соединений
  • доступа к системе
  • Файл
  • код с родными компонентами, такими как драйвер для usb, веб-камеры и т. д.
  • Объекты с потоком
+0

Спасибо! это было здорово! – Neo

+0

@Neo: если вы считаете это полезным, подтвердите или даже отметьте его как ответ. Вот как вы вознаграждаете сообщество, которое помогает вам здесь! :-) – Stefan

+1

Я не могу выдвигать сейчас, потому что я новичок :), но я отметил это как ответ. еще раз спасибо! – Neo