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

如何在C#版Bot Framework中实现等待时的进度提示消息?

在Bot Framework(C#)中实现长耗时API的提示消息

嘿,这个需求实现起来挺顺手的,核心就是先给用户发个即时提示,再异步处理耗时的API请求,不让用户傻等没反馈。我给你两种常用的实现方案,适配不同的Bot开发场景:

方案一:在Dialog流程中处理(推荐,适合复杂对话)

如果你的Bot是用Dialog来管理对话流程的(比如WaterfallDialog),直接在对应的Step里先发送提示,再执行API:

private async Task<DialogTurnResult> HandleLongRunningApiStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    // 第一步:立刻发送等待提示
    await stepContext.Context.SendActivityAsync(
        MessageFactory.Text("Please hold on a moment, I am getting the results"),
        cancellationToken);

    // 第二步:异步执行耗时API调用
    // 如果你的API本身是异步方法,直接await即可
    var apiResult = await YourLongRunningAsyncApiCall(cancellationToken);
    // 如果是同步API,用Task.Run包装避免阻塞Bot主线程
    // var apiResult = await Task.Run(() => YourLongRunningSyncApiCall(), cancellationToken);

    // 第三步:API返回后发送结果
    await stepContext.Context.SendActivityAsync(
        MessageFactory.Text($"Here's what I found: {apiResult}"),
        cancellationToken);

    return await stepContext.NextAsync(null, cancellationToken);
}

方案二:在TurnHandler中直接处理(适合简单对话)

如果你的Bot逻辑比较简单,直接在OnTurnAsync方法里判断意图并处理:

protected override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default)
{
    if (turnContext.Activity.Type == ActivityTypes.Message)
    {
        // 先检测用户触发的意图(这里假设你有自己的意图检测逻辑)
        var detectedIntent = await GetUserIntentAsync(turnContext, cancellationToken);
        
        if (detectedIntent == "YourTargetLongRunningIntent")
        {
            // 发送等待提示
            await turnContext.SendActivityAsync(
                MessageFactory.Text("Please hold on a moment, I am getting the results"),
                cancellationToken);

            // 执行耗时API
            var apiResponse = await YourLongRunningApiOperationAsync(cancellationToken);

            // 返回结果给用户
            await turnContext.SendActivityAsync(
                MessageFactory.Text($"Done! Result: {apiResponse}"),
                cancellationToken);
        }
        else
        {
            // 处理其他普通消息/意图
            await turnContext.SendActivityAsync(MessageFactory.Text("Got your message! Let me know how I can help."), cancellationToken);
        }
    }

    await base.OnTurnAsync(turnContext, cancellationToken);
}

几个关键注意点

  • 一定要用异步处理:不管API是同步还是异步,都要确保Bot主线程不被阻塞,否则会影响其他用户的请求处理。
  • 传递取消令牌:全程传递cancellationToken,当用户中断对话或者Bot服务重启时,可以及时取消正在执行的API请求,避免资源浪费。
  • 超长时间任务的特殊处理:如果API调用超过15分钟(Bot Framework对话上下文的默认超时),建议用后台任务队列+对话状态持久化的方式,避免对话上下文失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:25:38