2013-07-26 7 views
0

Этот цикл foreach проверяет веб-страницу и видит, есть ли какие-либо изображения, а затем загружает их. Как я могу остановить его? Когда я нажимаю кнопку, он продолжает цикл навсегда.C# остановка бесконечного цикла foreach

private void button1_Click(object sender, EventArgs e) 
    { 
     WebBrowser browser = new WebBrowser(); 
     browser.DocumentCompleted +=browser_DocumentCompleted; 
     browser.Navigate(textBox1.Text);   
    } 

    void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     WebBrowser browser = sender as WebBrowser; 
     HtmlElementCollection imgCollection = browser.Document.GetElementsByTagName("img"); 
     WebClient webClient = new WebClient(); 

     int count = 0; //if available 
     int maximumCount = imgCollection.Count; 
     try 
     { 
       foreach (HtmlElement img in imgCollection) 
       { 
        string url = img.GetAttribute("src"); 
        webClient.DownloadFile(url, url.Substring(url.LastIndexOf('/'))); 

        count++; 
        if(count >= maximumCount) 
          break; 
       } 
     } 
     catch { MessageBox.Show("errr"); } 
    } 
+1

Что такое «кнопка», о которой вы говорите? – Jashaszun

+0

это всего лишь кнопка для выполнения кода. – FJam

+1

Когда вы хотите остановиться? –

ответ

0

использовать break; ключевое слово, чтобы выйти из цикла

+0

Как я узнаю, когда использовать 'break;' – FJam

+0

Если вы не знаете, когда остановиться, то вам нужно выяснить, почему цикл бесконечен. Если вы храните счетчик итераций, вы можете выбрать произвольное количество итераций, а затем выйти. –

0

Вы не имеете бесконечный цикл, то есть исключение, которое в настоящее время брошенную на основе, как вы пишете файл на диск

private void button1_Click(object sender, EventArgs e) 
{ 
    WebBrowser browser = new WebBrowser(); 
    browser.DocumentCompleted += browser_DocumentCompleted; 
    browser.Navigate("www.google.ca"); 
} 

void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    WebBrowser browser = sender as WebBrowser; 
    HtmlElementCollection imgCollection = browser.Document.GetElementsByTagName("img"); 
    WebClient webClient = new WebClient(); 

    foreach (HtmlElement img in imgCollection) 
    { 
     string url = img.GetAttribute("src"); 
     string name = System.IO.Path.GetFileName(url); 
     string path = System.IO.Path.Combine(Environment.CurrentDirectory, name); 
     webClient.DownloadFile(url, path); 
    } 
} 

Этот код отлично работает на моей среде. Проблема, с которой вы столкнулись, заключалась в том, что вы устанавливали DownloadFile filepath, вы устанавливали его как значение «\ myimage.png», и веб-клиент не мог найти путь, чтобы он бросал и исключение.

Вышеприведенный код переносит его в текущий каталог с расширением.

+0

он все еще делает то же самое ... – FJam

+0

Каков максимальный размер, который вы получаете? – jrbeverly

+0

столько изображений найдено на странице. – FJam

0

Возможно, браузер событий.DocumentCompleted вызывает ошибку, если страница обновляется, событие снова запускается. Вы можете попытаться отменить регистрацию события.

void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{  
    WebBrowser browser = sender as WebBrowser; 

    browser.DocumentCompleted -= browser_DocumentCompleted; 

    HtmlElementCollection imgCollection = browser.Document.GetElementsByTagName("img"); 
    WebClient webClient = new WebClient(); 

    foreach (HtmlElement img in imgCollection) 
    { 
     string url = img.GetAttribute("src"); 
     string name = System.IO.Path.GetFileName(url); 
     string path = System.IO.Path.Combine(Environment.CurrentDirectory, name); 
     webClient.DownloadFile(url, path); 
    } 
} 
Смежные вопросы