Цикл с несколькими HTTPWebRequest и JSON deserializer медленно - PullRequest
0 голосов
/ 18 февраля 2019

Проблема

У меня есть приложение на C #, в котором у меня от 40 до 50 различных идентификаторов задач Asana.Мне нужны подробности для каждого идентификатора, поэтому я делаю запрос в цикле for для каждого идентификатора.Данные представлены в формате JSON:

// For each result in the data.
foreach (var result in results["data"])
{
    // ID for each Asana task in the data.
    string id = (string)result["id"];

    // Deserialize the JSON data so we can use it with an object and its properties.
    deserialize.SetJsonData(requestAsana.getSingleAsanaTask(id));

    // Add data to the list.
    asanaDataList.Add(deserialize.Data);
} 

Метод SetJsonData десериализует данные JSON:

    private AsanaRootData root = new AsanaRootData();
    public string jsonData;
    public string SetJsonData(string json)
    {
        this.jsonData = json;

        root = JsonConvert.DeserializeObject<AsanaRootData>(jsonData);         

        return json;
    }

А метод getSingleAsanaTask - это метод, выполняющий запросы к Asana с заданнымиID:

public string getSingleAsanaTask(string taskID)
    {
        try
        {
            // Make a request variable with URL and ID.
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(taskURL + taskID);
            // Speed up requests.
            request.Proxy = null;

            // Encode authentication value.
            String encoded = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(auth));

            // Add authentication to header.
            request.Headers.Add("Authorization", "Basic " + encoded);

            // Response variable.
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            // Get the stream associated with the response.
            Stream receiveStream = response.GetResponseStream();

            // Pipes the stream to a higher level stream reader with the required encoding format. 
            StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);

            return readStream.ReadToEnd();
        }
        catch (WebException e)
        {
            Debug.WriteLine("\nInvalid Asana task ID\n");
        }
        return "";
    }

Вопросы

Иногда я могу загрузить более 50 задач, но это может занять до 20 секунд.Есть ли способ повысить производительность, или я, возможно, делаю это неправильно?

  • Я вижу, что я создаю новую переменную HTTPWebRequest для каждого запроса, это имеет значение?
  • Может ли это быть мой метод десериализации, который все замедляет?

Что я пробовал?

  • ServicePointManager.DefaultConnectionLimit = connectionLimit;

  • req.Proxy = null;

  • ServicePointManager.Expect100Continue = false;

  • Потоки для метода setJsonData.

  • Stopwatch timer = new Stopwatch();, где запросызаняло примерно 40% времени.

Сужено до

  • Следующая строка занимает половину времени: HttpWebResponse response = (HttpWebResponse)request.GetResponse();
...