Общая задача для получения списка объектов из api

#c# #async-await #blazor

#c# #асинхронное ожидание #blazor

Вопрос:

я создаю какое-то решение в blazor, я хочу иметь общий способ «говорить» с моим api, чтобы получить список someclassst, подобный этому

   await api.ExecProcGetList<SomeClassT>(
        (list) =>
        {
            foreach (item in list)
            {
                Console.WriteLine(item.ID);
            }
            StateHasChanged();
        },
        (msg) =>
        {
            Console.WriteLine("error"   msg);
        }
     );
 

итак, в этом сервисе api у меня есть

   public  Task ExecProcGetList<T>(Action<List<T>> callback, Action<string> callbackOnFailed = null)
    {
        return  Task.Factory.StartNew(async (n)=>
        {
            string endpoint = "sp/t/"   this.dbName   "/"   this.schema   "/"   this.procName;
            var response = await this.httpClient.PostAsJsonAsync(endpoint, this.parameters);
            if (response.StatusCode == System.Net.HttpStatusCode.OK)
            {
                 callback(  await response.Content.ReadFromJsonAsync<List<T>>());               
            }
            else
            {
                if (callbackOnFailed != null) callbackOnFailed(response.Content.ReadAsStringAsync().Result.ToString());
                else Console.WriteLine(response.Content.ReadAsStringAsync().Result.ToString());
            }

        }, System.Threading.Tasks.TaskCreationOptions.LongRunning);

    }
 

Я вижу, что список берется из api, как и должно быть, но я получаю список моих элементов этого someclassst с пустыми значениями.

имена свойств в порядке, поэтому я предполагаю, что этот T неправильно передан этой задаче?

как я должен это исправить? спасибо и с уважением


Редактировать

 class SomeClassT
{
    public int ID
    public int IDSiec;
}
 

необработанный ответ

[{"ID":11401174,"IDSiec":1380},{"ID":11411073,"IDSiec":300},{"ID":11401172,"IDSiec":1308}]

Комментарии:

1. Пожалуйста, добавьте необработанный ответ api на вопрос, а также определение класса, к которому вы пытаетесь десериализовать.

2. И ReadFromJsonAsync ничего не выдает или что-то в этом роде?

3. Это Task.Run предпочтительный способ перенести работу в фоновый поток. Если вы Task.Factory.StartNew по какой-то причине хотите использовать с асинхронным делегатом, вам нужно сделать Unwrap() это в конце. Посмотрите здесь , почему. В качестве примечания, вам следует избегать блокирования текущего потока, читая .Result свойство задачи. await В конце концов, именно поэтому он существует.

4. ExecProcGetList должен быть отмечен async ключевым словом, если await находится внутри

5. Теодор Зулиас спасибо за статью, я этого не знал;) и я знал, что всегда должен ждать, просто хотел изменить это после того, как основная функция будет в порядке 😉

Ответ №1:

хорошо, спасибо всем за советы, но ни один из них не был правильным, проблема заключалась в том, что я пропустил

 { get; set; }
 

в полях класса
с этим все в порядке.