Вы можете рассмотреть вопрос об использовании 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, веб-камеры и т. д.
- Объекты с потоком
Возможно, вам захочется проверить, реализует ли какой-либо из этих объектов интерфейс 'IDisposable'. Если это так, вызовите метод Dispose. (особенно wrGETURL, будьте осторожны с потоками, их не следует закрывать до завершения соединения.) – Stefan
Спасибо! но не могли бы вы рассказать мне, как я могу это сделать? Я новичок в C# – Neo
Я добавляю строку http.dispose(); в конце функции и работает хорошо. Еще раз спасибо! – Neo