私はこのコードを複数のウェブサイトからダウンロードしています。 このコードを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 };
}
そして、これは私が自分のタスクを作成する方法です例外と私のプロセスを遅くしないために?
私は誰かが私を助けることを願っています、ありがとう!
これはファイアホースの問題です。完了するまでに時間がかかりすぎる作業が多すぎます。 [デバッグ]> [Windows]> [スレッド]ウィンドウでは、デバッグが表示されます。あなたは記憶がなくなる可能性があります。 Threadpool.SetMaxThreads()は粗末だが単純な対策です。 –
アクティブな 'Task'sの数を制限するために' SemaphoreSlim'を導入することは、より単純な(粗い場合でも)回避策です。それでも、より良い解決策は、最初に一回のヒットで巨大な「タスク」インスタンスを作成しないことです。 TPLのデータフローまたは同様のフレームワークを使用すると、並列度の最大度を指定することができます。 –