Этот код делает именно то, что я хочу:
Такое ощущение, что это провалит проверку кода, хотя это именно то, что мне нужно.
Есть ли какой-нибудь лучший шаблон для этого, показывающий div с «мышлением» до завершения вызова API.
private async Task SendMessage()
{
var messageHolder = userMessage;
Console.WriteLine($"User Message is: {userMessage}");
if (!string.IsNullOrWhiteSpace(messageHolder))
{
messages.Add(new ChatMessageInPage { User = "User", Message = messageHolder });
var msg = new ChatMessageInPage { User = "Robot 🤖", Message = "Thinking..." };
messages.Add(msg);
userMessage = string.Empty;
// THS IS THE ODD CODE
Task.Run( async () =>
{
msg.Message = await apiRobot.GetBotResponse(messageHolder);
InvokeAsync(() =>
{
NeedScrollBottom = true;
StateHasChanged();
});
}
);
NeedScrollBottom = true;
StateHasChanged();
}
}
Обычно это должно делать то же самое более простым и надежным способом:
if (!string.IsNullOrWhiteSpace(messageHolder))
{
messages.Add(new ChatMessageInPage { User = "User", Message = messageHolder });
var msg = new ChatMessageInPage { User = "Robot 🤖", Message = "Thinking..." };
messages.Add(msg);
userMessage = string.Empty;
// Simple code - display previous during await
NeedScrollBottom = true;
await Task.Delay(1); // recommended, for when the apiRobot isn't async enough
msg.Message = await apiRobot.GetBotResponse(messageHolder);
NeedScrollBottom = true;
}
если это не работает так, как ожидалось, опубликуйте точные результаты.
Это не всегда требуется — это зависит от реализации GetBotResponse(). Хотя я бы назвал это рекомендуемым.
Например, если бы существовал метод, у которого не было доступного асинхронного вызова, который мог бы привести к недостаточности асинхронности?
Да, ваш путь к коду должен на мгновение отказаться от потока. Это не то, что вы обычно можете знать или требовать от Сервиса.
Ух ты! Удивительное выполнение await Task.Delay(1) решило проблемы с просмотром. Когда его нет, он не обновляет пользовательский интерфейс, поэтому я бы назвал это обязательным. Спасибо, Хенк!