2013-07-22 2 views
0

Самая медленная часть моего кода эти строки прямо здесь:Можете ли вы «Очередь» webRequest на фоне ускорить вашу программу?

 string responseString; 
     var webRequest = WebRequest.Create(url); 
     using (var response = webRequest.GetResponse()) 
     using (var sr = new StreamReader(response.GetResponseStream())) 
     { 
      responseString = sr.ReadToEnd(); 
     } 
     return responseString; 

есть способ «очереди» несколько WebRequest и иметь их загрузки в фоновом режиме, в то время как мой код разбирает HTML между запросами страниц? Есть ли имя/метод для этого, я могу google? любые ссылки или код очень ценятся! благодаря!

* Редактирование: полный getHTML (код) добавлен

+0

В названии не требуется C#, для чего предназначены теги. – rene

+1

Вы можете пойти [async] (http://msdn.microsoft.com/en-us/library/86wf6409 (v = vs.110) .aspx) – rene

ответ

3

Вы можете использовать методы асинхронных, чтобы разблокировать ваш пользовательский интерфейс и обрабатывать запросы там.

Но ваша опубликованная строка кода не должна почти ничего делать. Запрос на сервер возникает при вызове ответа. С:

var respone = webRequest.GetResponse(); 

Просто используйте, чтобы разблокировать UI и обработать его после того, как асинхронная progresss IST сделано.

var response = webRequest.GetResponseAsync(); 
// or BeginResponse() ... EndResponse(); 

Вы можете прочитать следующее для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/86wf6409(v=vs.110).aspx

+0

Это действительно просто начало ... – Servy

+0

Не стесняйтесь распространять мой ответ на ваши сердечные радости. –

+0

Я сделал это. – Servy

1

Что вы ищете является производителем потребительского стилем программирования. Всякий раз, когда вы видите, что BlockingCollection часто является хорошим инструментом. Это коллекция (по умолчанию используется очередь), которая предназначена для безопасного доступа из нескольких потоков.

Вы можете начать с потребителями, которые асинхронно делают запросы, а затем положить результаты запроса в очередь:

BlockingCollection<string> queue = new BlockingCollection<string>(); 

foreach(string url in links) 
    var webRequest = WebRequest.Create(url); 
    webRequest.GetRequestStreamAsync() 
     .ContinueWith(t => new StreamReader(t.Result).ReadToEnd()); 

Тогда вы можете иметь код, который обрабатывает каждый из результатов в очереди поскольку они входят: (может быть, это может быть более одного потребителя, если это имеет смысл.)

foreach(var fileText in queue.GetConsumingEnumerable()) 
{ 
    processText(fileText); 
} 
Смежные вопросы