You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor API调用后UI更新:现有实现的优化方案问询

优化“显示Thinking状态直至API调用完成”的实现方式

原代码虽能实现需求,但存在几个明显问题:

  • 滥用Task.Run:GetBotResponse本身就是异步方法,无需额外开启线程,徒增系统开销
  • 未处理异步任务异常:API调用失败时无容错逻辑,用户会一直看到“Thinking...”状态
  • 代码结构零散:状态更新逻辑拆分在两处,可读性和可维护性差

以下是更符合Blazor异步编程模型的优化实现:

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 thinkingMsg = new ChatMessageInPage { User = "Robot 🤖", Message = "Thinking..." };
        messages.Add(thinkingMsg);
        userMessage = string.Empty;

        // 立即更新UI,展示思考状态并滚动到底部
        NeedScrollBottom = true;
        StateHasChanged();

        try
        {
            // 直接异步调用API,无需额外线程
            var botResponse = await apiRobot.GetBotResponse(messageHolder);
            // 更新为机器人实际回复
            thinkingMsg.Message = botResponse;
        }
        catch (Exception ex)
        {
            // API调用失败时给出友好提示
            thinkingMsg.Message = "抱歉,我暂时无法回复,请稍后再试。";
            Console.WriteLine($"API调用异常:{ex}");
        }

        // 再次更新UI,展示最终回复并滚动到底部
        NeedScrollBottom = true;
        await InvokeAsync(StateHasChanged);
    }
}

优化说明

  • 移除冗余的Task.Run:直接await异步API调用,遵循Blazor异步编程规范,避免不必要的线程切换
  • 增加异常处理:捕获API调用可能出现的错误,避免用户一直处于等待状态,同时记录异常日志便于排查
  • 统一状态更新流程:先触发UI更新显示思考状态,API返回后再更新为实际回复,逻辑清晰直观
  • 严谨的UI线程更新:使用await InvokeAsync(StateHasChanged)确保状态更新在UI线程执行,避免潜在的线程安全问题

内容的提问来源于stack exchange,提问作者Carter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 06:53:20