Асинхронный json на c#

158
12 ноября 2018, 18:40

Мне надо обработать 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"
}
READ ALSO
Конвертировать строку в Unicode [дубликат]

Конвертировать строку в Unicode [дубликат]

На данный вопрос уже ответили:

142
Производительность наполнения DataTable

Производительность наполнения DataTable

Заметил интересную особенность, что если наполнять DataTable запросом, где фигурирует звездочка, то он наполняется на несколько секунд дольше,...

138
Как получить Unicode код числа?

Как получить Unicode код числа?

Согласно вот этой таблице:

151
Excel меняет точку на запятую

Excel меняет точку на запятую

Когда я вставляю в ячейку текст через

152