Мне надо обработать 20 элементов, полученных с помощью json. Элементы могут быть двух типов, и для каждого надо запросить разную дополнительную информацию. Я использую асинхронные методы для получения информации в json ответе, но проблема в том, что получается обработать только 8 элементов из 20. Если добавить задержку Thread.Sleep() то он все правильно обрабатывает.
Это мой первый опыт в асинхронном программировании, так что сам разобраться никак не могу. Буду очень благодарен за помощь.
Вот общий метод для json ответов:
async public static Task<T> request(string method, string fields)
{
//Запрос
string main = "https://url";
WebRequest request = WebRequest.Create(
main + method + fields);
WebResponse response = (HttpWebResponse)await request.GetResponseAsync();
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd();
T req = JsonConvert.DeserializeObject<T>(responseFromServer);
return req;
}
А вот уже основная функция:
async public Task GetElem()
{
//Получаем 20 элементов
GetItems = await json_request<GetTypes>.request("GetTypes", "count=20");
int a = 0;
while (a < 20)
{
//Создаем новую промежуточную структуру
Test_mas mas1 = new Test_mas();
//Общее поле для элементов обоих типов
mas1.item1 = GetItems.items[a].field1;
//Проверяем тип элемента
if (GetItems.items[a].type == "type_1")
{
//Получаем дополнительную информацию, отдельная функция
var type1 = await GetType_1(a);
//Присваиваем полученную информацию
mas1.item2 = type1.fields1;
mas1.item3 = type1.fields2;
}
else if (GetItems.items[a].type == "type_2")
{
//Получаем дополнительную информацию, отдельная функция
var type2 = await GetType_2(a);
//Присваиваем полученную информацию
mas1.item2 = type2.fields1;
mas1.item3 = type2.fields2;
}
//Добавляем в общий список
mass.Add(mas1);
a++;
}
}
И вот наконец метод для получения дополнительной информации:
async public Task<type1> GetType_1(int a)
{
string method = "type1";
string fields = "field";
int id = GetItems.items[a].id;
//Выполняем функцию для json ответа
var user = json_request<type1>.request(method, fields + "id=" + id);
return await user;
}
Функция для обработки элемента 2 типа почти ничем не отличается.
Пример json:
Для GetTypes:
{
"count": 20,
"items": [{
"id": 1,
"type": "type_1",
"field1" : "string"
}, {
"id": 2,
"type": "type_2",
"field1" : "string"
}]
}
А вот для type1 и 2
{
"id": 1,
"fields1": "string",
"fields2": "string"
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Заметил интересную особенность, что если наполнять DataTable запросом, где фигурирует звездочка, то он наполняется на несколько секунд дольше,...