#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; }
в полях класса
с этим все в порядке.