2017-09-30 6 views
0

私はこのコードを複数のウェブサイトからダウンロードしています。 このコードを50.000回実行する必要があります。C#TaskCanceledExceptionと私のCPUが100%にシュートします(プロセスは信じられないほど遅くなります)

2分(約4000回)実行した後、TaskCanceledExceptionが発生し、CPUが100%になり、プロセスが非常に遅くなります。私はこれを持っていないように、私は私のコードを最適化することができますどのような方法があります

 public string[][] GetAll(
     IEnumerable<string> adresses, 
     IEnumerable<string> postalCodes) 
    { 
     // Start all tasks one by one without waiting for responses 

     var tasks = adresses.Zip(postalCodes, (addr, code) => { return GetDataAsync(addr, code); }); 

     return Task.WhenAll(tasks).Result; 

    } 

この

はコードです:

 public async Task<string[]> GetDataAsync(string address, string postalCode) 
    { 
     var path = $"{address} {postalCode}/"; // build proper path for request 
     var textFrom1 = ""; 
     string textFrom3 = ""; 
     string textFrom2 = ""; 
     while (true) 
     { 
      try 
      { 
       textFrom1 = await client.GetStringAsync("http://website1.com/" + path); 
       break; 
      } 
      catch (Exception e) //404 
      { 

       await Task.Delay(10000); // try every 10 seconds (so I do not bomb the server with requests). 
      } 
     } 


     if (textFrom1.Split(':', ',')[1] == "0") 
     { 
      return new string[] { "null", "null", "null", "null", "null" }; 
     } 


     while (true) 
     { 
      try 
      { 

       textFrom2 = await client.GetStringAsync("http://website2.com/" + textFrom1.Split('"', '"')[11]); 
       break; 
      } 
      catch (Exception e) 
      { 
       await Task.Delay(10000); 
      } 
     } 
     while (true) 
     { 
      try 
      { 
       textFrom3 = await client.GetStringAsync("http://website3.com/" + textFrom2.Split('"', '"')[3]); 
       break; 
      } 
      catch (Exception e) 
      { 
       await Task.Delay(10000); 
      } 
     } 
     var allData = await Task.Run(() => JsonConvert.DeserializeObject<List<RootObject>>(textFrom3)); 

     var item = allData.First(); 
     return new string[] { item.item1, item.item2, item.item3, item.item4, item.item5 }; 
    } 

そして、これは私が自分のタスクを作成する方法です例外と私のプロセスを遅くしないために?

私は誰かが私を助けることを願っています、ありがとう!

+1

これはファイアホースの問題です。完了するまでに時間がかかりすぎる作業が多すぎます。 [デバッグ]> [Windows]> [スレッド]ウィンドウでは、デバッグが表示されます。あなたは記憶がなくなる可能性があります。 Threadpool.SetMaxThreads()は粗末だが単純な対策です。 –

+0

アクティブな 'Task'sの数を制限するために' SemaphoreSlim'を導入することは、より単純な(粗い場合でも)回避策です。それでも、より良い解決策は、最初に一回のヒットで巨大な「タスク」インスタンスを作成しないことです。 TPLのデータフローまたは同様のフレームワークを使用すると、並列度の最大度を指定することができます。 –

答えて

0

あなたは一度に処理できる最大数のタスクに到達していると思います。小規模なグループに50.000リクエストを分割したり、実行中の非同期タスクを処理するためのコードを記述して、一度に多くのタスクを開始しないようにすることができます。

さらに、最大ポート数に達している可能性があります。新しい接続を開始するたびに、アプリケーションは新しい動的ポートを開きます。

+1

ありがとうございます。リストを複数のタスクに分けてください。 :) – Rick

関連する問題