Проблема
У меня есть приложение на 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();