2016-11-20 2 views
0

私が最終的に達成しようとしているのは、GetPage(i)がページiのHTMLを返す未知であるが限定された数のWebページからHTMLを取得することで、非ページが見つかるとすぐに停止したい。C#でこの並列パターンを実装するにはどうすればよいですか?

私は行くよ、正確なパターンは、このようなものです:

  • スタートGetPage(0)あるN並列タスク、...、GetPage(N-1)
  • タスクGetPage(i)が完了すると、タスクがページを取得できた場合は、そのページをページのコレクションに追加し、まだ処理しようとしていない次の最大ページを取得しようとします。タスクがページを取得できなかった場合は、すべてのタスクをキャンセルします。GetPage(j)j>i

だから私の未遂実装は、これはあなたが探しているものかもしれません

 var docs = new LinkedList<HtmlDocument>(); 
     int tlimit = 20; 
     var tasks = new Task<HtmlDocument>[tlimit]; 
     for(int i = 0; i < tlimit; ++i) 
     { 
      tasks[i] = Task<HtmlDocument>.Factory.StartNew(() => BoardScanner.GetBoardPage(i)); 
     } 
     /// ??? 
+0

説明。 「タスクGetPage(i)が完了すると、タスクがページを取得できた場合は、そのページをページのコレクションに追加し、まだ処理しようとしていない次のページを取得しようとする」 - これは、ページの順次処理。あなたはこのプロセス全体を非同期的に行うかもしれません。 – agfc

答えて

0

のようなものです。おそらく最大のものから始まって、あなたの文書を並行して非同期に扱います。あなたが本当に最大のものを使いたいなら、これをかなり微調整する必要があります。そして、並列処理の並列処理が終わると、最初に何が処理されるかを決定するという点で、マシンをより細かく制御するという意味にはなりません。

var docs = new List<XmlDocument>(); 

      var tasks = docs.OrderBy(p => p.InnerXml.Length).Select(file => Task.Run(async() => 
      { 
       await BoardScanner.GetBoardPage(file); 
       // your document treatment logic here 
      } 
       )); 

      await Task.WhenAll(tasks); 
      // your logic upon all of your documents were treated; 
関連する問題