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
相关产品推荐
相关产品推荐

