2017-09-23 21 views
0

私は、非同期タスクを少し新しくしました。C#多くの非同期タスクを同時に実行する

私は学生IDを取得し、特定の大学のウェブサイトから必要なIDでデータをスクラップする機能を持っています。

private static HttpClient client = new HttpClient(); 
    public static async Task<Student> ParseAsync(string departmentLink, int id, CancellationToken ct) 
    { 
     string website = string.Format(departmentLink, id); 
     try 
     { 
      string data; 
      var stream = await client.GetAsync(website, ct); 
      using (var reader = new StreamReader(await stream.Content.ReadAsStreamAsync(), Encoding.GetEncoding("windows-1256"))) 
       data = reader.ReadToEnd(); 

      //Parse data here and return Student. 
     } catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

正常に動作します。私は多くの学生のために、この機能を実行する必要があるのに時々私は、私は後でそれらを待つために、アレイ内のタスクを格納してい

 for(int i = ids.first; i <= ids.last; i++) 
     { 
      tasks[i - ids.first] = ParseStudentData.ParseAsync(entity.Link, i, cts.Token).ContinueWith(t => 
      { 
       Dispatcher.Invoke(() => 
       { 
        listview_students.Items.Add(t.Result); 
        //Students.Add(t.Result); 
        //lbl_count.Content = $"{listview_students.Items.Count}/{testerino.Length}"; 
       }); 
      }); 
     } 

次を使用します。

これは、生徒数が(0、〜600?)の間であれば、細かいこともあります。 そしてまだ解析されていない他のすべての学生はを投げます。タスクはキャンセルされました

私は決してキャンセルトークンを使用しないことに注意してください。

非常に多くの学生にこの機能を実行する必要があります。これは〜9000の非同期タスクに完全に到達することができます。何が起こっているのですか?

答えて

2

このような短い時間枠で9000リクエストをキューイングしている場合、基本的にはWebサイトでサービス拒否攻撃を作成しています。これはあなたにエラーを引き起こすだけでなく、ウェブサイトをダウンさせる可能性があります。同時リクエストの数をより合理的な値(たとえば30)に制限することが最善の方法です。これを行うにはいくつかの方法は、おそらくありますが、頭に浮かぶ一つは以下の通りです:

private async Task Test() 
{ 
    var tasks = new List<Task>(); 
    for (int i = ids.first; i <= ids.last; i++) 
    { 
    tasks.Add(/* Do stuff */); 
    await WaitList(tasks, 30); 
    } 
} 

private async Task WaitList(IList<Task> tasks, int maxSize) 
{ 
    while (tasks.Count > maxSize) 
    { 
    var completed = await Task.WhenAny(tasks).ConfigureAwait(false); 
    tasks.Remove(completed); 
    } 
} 

他のアプローチは、このようなBlockingCollection

などの.Netのクラスを使用してプロデューサ/コンシューマパターンを活用する可能性があります
関連する問題