0

私はスレッドプログラミングにかなり慣れていません。私は実際にある種のメタ検索エンジンを開発していて、毎秒Webページを解析するアプリケーションが必要です。

私のアプリケーションには、必要なWebページを解析する関数があります。つまり、go_parse( "http://www.google.com/page/1);

私がやりたいのは、関数がページ1の解析を終了したときに、ページ2などを解析することです。しかし、これを行う方法について少し混乱しています。

go_parse関数を少なくとも50回起動するループを作成する必要があります(1〜50ページ)。

誰かがこれで私を助けてくれることを願っています。

前もって感謝します。

編集:

TASK関数を使用すると、それを機能させることができます:

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));
    }

皆さんありがとう

4

3 に答える 3

4

C#4.0を使用している場合は、タスク、その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)
}

これは単なる基本的な考え方です。当然、ニーズに合うように変更および設計する必要があります。

于 2013-01-02T14:39:53.287 に答える
0

こんなことをしてから久しぶりです。基本的には、処理するアイテムのリストを保持するqueを使用してクラスを作成しました。私よりも、queを通過し、ループを介してこれらを1つずつ処理する処理クラスで新しいスレッドを開始しました。

キューにアイテムがない場合、プロセッサは再び待機します。それ以外の場合、キューから次のアイテムが取得されます。

このようにして、処理される新しいアイテムを作成するアプリケーションは、処理の干渉なしに、別々に実行されたままになります。

私の記憶からこのように:

private CustomQueClass queClass = new CustomQueClass();

Thread backgroundThread = new Thread(
  new ThreadStart(() =>
  {
      CustomProcessClass processClass = new CustomProcessClass(queClass);
  }
));
backgroundThread.Start();
于 2013-01-02T14:45:42.897 に答える
0

あなたが持っているのは生産者/消費者関係です。BlockingCollectionクラスはこれらの状況に最適です。デフォルトでは、が使用されますConcurrentQueue。これは必要なものです。キューを作成し、各スレッドGetConsumingEnumerableが完了するまでアイテムを取得するために使用できる数のワーカースレッドを作成し、1つ以上のプロデューサーがキューにアイテムを追加するだけです。

于 2013-01-02T15:28:46.043 に答える