我有这个代码从多个网站下载数据。 我需要运行此代码大约50.000次。
然而,在运行代码2分钟(大约4000次)之后,我得到了TaskCanceledException并且我的CPU达到了100%并且我的进程变得非常缓慢。
这是代码:
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 };
}
这就是我创建任务的方式:
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;
}
有什么方法可以优化我的代码,这样我就没有这个例外,因此不会减慢我的进程吗?
我希望有人可以帮助我,谢谢!
答案 0 :(得分:0)
我认为您正在达到Windows可以同时处理的最大任务数量。您可以将50.000个请求拆分为较小的组或编写一些代码来处理正在运行的异步任务,以确保您不会立即启动太多任务。
此外,您可能达到了最大端口数。每次启动新连接时,您的应用程序都会打开一个新的动态端口。