2013-01-02 140 views
0

我很新的線程編程。我實際上正在開發某種元搜索引擎,我需要一個每秒鐘解析網頁的應用程序。c#多線程for循環

在我的應用我有解析通緝網頁的IE瀏覽器的功能:go_parse(「http://www.google.com/page/1);

我想要做的是當函數已完成解析頁1解析頁2,等..但我有點困惑如何做到這一點。

我必須做一個循環,啓動go_parse函數至少50次(第1頁到50)。

希望有人可以幫助我。

Thanks in a dvance。

編輯:

與任務功能,我可以得到它的工作:

public void ProcessNextPage(int page) 
    { 
     Task t = Task.Factory.StartNew(() => 
     { 
      go_parse("http://www.google.com" + searchForm.Text + "/"+page+"/"); 
     }); 
     t.ContinueWith(task => 
     { 
      if (label2.Text != "Stopped") 
      { 
       page++; 
       SetTextBoxText(page.ToString(), textBoxPage, false); 
       ProcessNextPage(page); 
      } 
     }); 
    } 

    private void button5_Click(object sender, EventArgs e) 
    { 
     label2.Text = "Started"; 
     ProcessNextPage(int.Parse(textBoxPage.Text)); 
    } 

感謝所有

+2

多線程的關係是什麼?頁面是否並行解析?您可能想查看**生產者消費者隊列模式**。 – Rotem

+0

您使用的是哪個版本的.Net?如果.Net 4。0看看任務,並繼續與 – MBen

+1

那麼在未來,我想有像5頁並行解析(取決於資源)的東西,但現在只是1後1將是一個好的開始。就像你說的那樣,隊列系統就是我要找的。 是的,我使用.net 4 – yves

回答

4

如果您正在使用C#4.0中,可以使用Task,其ContinueWith方法,和List<T>Queue<T>Stack<T>要處理的頁面。我想用Stack<T>

所以地方,我們擁有所有的網頁stack處理

public void ProcessNextPage() { 

    if(stack.Count == 0) //INFINIT LOOP BREAK CONDITION 
     return; 

    var pageToProcess = stack.Pop(); 
    Task.StartNew(t=> { 
     /*DO SOMETHING WITH pageToProcess*/ 
    }).ContinueWith(a=>processNextPage()); //ON COMPLETE, CALL MYSELF (RECURSION) 
} 

這僅僅是一個基本的想法,你,自然也應該在它最適合您需求的方式改變和建築師它。

+2

在這種情況下,爲什麼你更喜歡'Stack '而不是'隊列'? – Rotem

+0

那麼,因爲只是感覺(推)和越來越(流行)似乎*在這種情況下更簡單的解決方案,然後對指數進行操作。只是一個選擇問題。 – Tigran

+0

一個隊列不在索引上運行,它具有與彈出和推送(queue和tryDequeue)類似的方法,只有它是FIFO而不是LIFO(堆棧),這在本例中對我個人而言更合乎邏輯。 – Rotem

0

自從我做了這樣的事情已經有一段時間了。基本上總之,我做了一個課程,其中包含要處理的項目列表。我開發了一個新的線程,它帶有一個處理類,它通過一個循環逐個處理它們。

如果沒有項目在隊列中,則處理器再次等待從隊列中取得下一個項目。

通過這種方式,創建要處理的新項目的應用程序保持獨立運行並且不受處理的干擾。

有點像這樣從我的記憶:

private CustomQueClass queClass = new CustomQueClass(); 

Thread backgroundThread = new Thread(
    new ThreadStart(() => 
    { 
     CustomProcessClass processClass = new CustomProcessClass(queClass); 
    } 
)); 
backgroundThread.Start(); 
0

你有什麼是生產者 - 消費者關係。對於這些情況,BlockingCollection類是完美。默認情況下,它將使用ConcurrentQueue,這是你想要的。只需創建隊列,根據需要創建儘可能多的工作線程,每個工作線程都可以使用GetConsumingEnumerable來完成項目,直到它們完成,並且一個或多個生產者將項目添加到隊列中。