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

Bot Framework C#:如何检测并延续活跃对话流程

解决对话流程中断问题:检测活跃对话并延续流程

你的核心问题是没有检测对话状态是否存在活跃对话,当前代码仅在输入“hello”时启动对话,后续输入会直接进入else分支,导致对话流程中断。要实现需求,需要先判断是否有正在运行的对话,再决定执行逻辑。

修正后的代码

public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default)
{
    var text = turnContext.Activity.Text;
    // 获取对话状态属性
    var dialogStateProperty = ConversationState.CreateProperty<DialogState>(nameof(DialogState));
    var dialogState = await dialogStateProperty.GetAsync(turnContext, () => new DialogState());

    // 优先检查是否有活跃对话
    if (dialogState.Stack.Any())
    {
        // 存在活跃对话,直接延续流程
        await Dialog.RunAsync(turnContext, dialogStateProperty, cancellationToken);
    }
    else
    {
        // 无活跃对话时,判断是否触发启动对话
        if (text == "hello")
        {
            await Dialog.RunAsync(turnContext, dialogStateProperty, cancellationToken);
        }
        else
        {
            await turnContext.SendActivityAsync("dialog is not running");
        }
    }

    await base.OnTurnAsync(turnContext, cancellationToken);
    // 保存状态变更
    await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);
}

关键改动说明

  • 先检测活跃对话:通过dialogState.Stack.Any()判断对话栈中是否存在未完成的对话,这是判断对话是否活跃的核心依据
  • 复用对话状态属性:将dialogStateProperty提取为变量,避免重复创建,保证状态读取和修改的一致性
  • 逻辑优先级调整:优先处理活跃对话的延续,再处理新对话的启动或无对话的提示

这样修改后,当用户输入“hello”启动对话后,后续所有输入都会进入活跃对话分支,延续对话流程;当对话结束(栈为空)后,才会回到初始判断逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:51:41