C#TaskCanceledException和我的CPU射到100%(进程放慢了令人难以置信)

时间:2017-09-30 12:06:55

标签: c# asynchronous task

我有这个代码从多个网站下载数据。 我需要运行此代码大约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;

    }

有什么方法可以优化我的代码,这样我就没有这个例外,因此不会减慢我的进程吗?

我希望有人可以帮助我,谢谢!

1 个答案:

答案 0 :(得分:0)

我认为您正在达到Windows可以同时处理的最大任务数量。您可以将50.000个请求拆分为较小的组或编写一些代码来处理正在运行的异步任务,以确保您不会立即启动太多任务。

此外,您可能达到了最大端口数。每次启动新连接时,您的应用程序都会打开一个新的动态端口。