Давайте процитируем руководство :
пример, данный здесь, изобретен, конечно, но для вывода большие блоки из текста, выпадая из PHP парсинг режима обычно более эффективен, чем отправка всего текста через эхо () или печать ().
, Но слушайте другие и избегайте этого вида микро оптимизации и выберите ту, которая является более четкой.
я могу предложить третье решение? Вы услышали о движках шаблонов? Они помогают Вам создать четкое разделение между кодом и презентацией, которая обычно приводит к более чистому коду, который легче поддержать. Популярное, которое такой движок шаблонов, например, присяжный острослов , но существует сотни с различными преимуществами.
Если бы я был на вашем месте, вот несколько возможностей, которые я бы исследовал:
Мои деньги на последний, так как тот факт, что он всегда прерывается при хорошем круглом количестве запросов, и что включение отладчика (он же медленнее!) Не вызывает проблемы.
Проверить все это , Я бы начал с простого: придерживайтесь задержки (Thread.Sleep) перед каждым HTTP-вызовом и посмотрите, исчезнет ли проблема. Если это так, уменьшите задержку, пока проблема не вернется. Если этого не происходит, увеличьте задержку до большого числа (например, 10 секунд), пока проблема не исчезнет. Если это не пройдет с задержкой в 10 секунд, это действительно загадка, и я ' Мне нужна дополнительная информация для диагностики.
Если он уходит с задержкой, то вам нужно выяснить, почему - и является ли ограничение постоянным (например, брандмауэр сервера, который вы не можете изменить) или что-то, что вы можете изменить. Чтобы получить дополнительную информацию, вам нужно будет синхронизировать запросы (например, проверять DateTime.Now до и после каждого вызова), чтобы увидеть, видите ли вы шаблон. Если все тайминги совпадают и внезапно становятся огромными, это предполагает регулирование сети / брандмауэра / прокси. Если время постепенно увеличивается, это говорит о том, что сервер постепенно перегружается и очередь запросов увеличивается.
В дополнение к таймингу запросов, я бы установил более длительный тайм-аут вызовов вашего веб-клиента, чтобы вы могли определить, бесконечен ли тайм-аут или он немного больше, чем по умолчанию. Для этого вам понадобится альтернатива классу WebClient, поскольку он не поддерживает тайм-аут. В этой ветке на форумах MSDN есть разумный альтернативный пример кода.
Альтернативой добавлению времени в код является использование Fiddler:
кажется, что WebClient
не закрывает объект Response
, который он использует по завершении, что приведет к тому, что в вашем случае многие ответы будут открыты по адресу в то же время и с ограничением 25 подключений на удаленном сервере вы получили «исключение тайм-аута». При отладке ранние открытые ответы закрываются из-за их внутреннего тайм-аута и т. Д.
(Я обнаружил WebClient
, что с помощью Reflector я не могу найти инструкцию для закрытия ответа).
Я предлагаю, чтобы вы использовали HttpWebRequest & HttpWebResponse
, чтобы вы могли очищать объекты после каждой загрузки:
HttpWebRequest request;
HttpWebResponse response = null;
try
{
FileStream fs;
Stream s;
byte[] read;
int count;
read = new byte[256];
request = (HttpWebRequest)WebRequest.Create(remoteFilename);
request.Timeout = 30000;
request.AllowWriteStreamBuffering = false;
response = (HttpWebResponse)request.GetResponse();
s = response.GetResponseStream();
fs = new FileStream(localFilename, FileMode.Create);
while((count = s.Read(read, 0, read.Length))> 0)
{
fs.Write(read, 0, count);
count = s.Read(read, 0, read.Length);
}
fs.Close();
s.Close();
}
catch (System.Net.WebException)
{
//....
}finally
{
//Close Response
if (response != null)
response.Close();
}