Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 子对话框被中断时,中断不起作用_C#_Botframework - Fatal编程技术网

C# 子对话框被中断时,中断不起作用

C# 子对话框被中断时,中断不起作用,c#,botframework,C#,Botframework,使用v4.7.2 我有以下情况: 主对话框 帮助对话框(组件对话框-瀑布) 对话框A(组件对话框-瀑布) 对话框B(组件对话框-瀑布) 对话框C(组件对话框-瀑布) 在我的MainDialog中,我有一个OnInterruptDialogAsync的实现,它检查用户是否说“Help”,我们将启动一个HelpDialog 在我的OnInterruptDialogAsync中,我正在执行以下操作: 我有一个对话框名称列表,其中包括用户提示 我检查ActiveDialog是否在该列表中 我返回

使用v4.7.2

我有以下情况:

  • 主对话框
  • 帮助对话框(组件对话框-瀑布)
  • 对话框A(组件对话框-瀑布)
  • 对话框B(组件对话框-瀑布)
  • 对话框C(组件对话框-瀑布)
在我的MainDialog中,我有一个OnInterruptDialogAsync的实现,它检查用户是否说“Help”,我们将启动一个HelpDialog

在我的OnInterruptDialogAsync中,我正在执行以下操作:

  • 我有一个对话框名称列表,其中包括用户提示
  • 我检查ActiveDialog是否在该列表中
    • 我返回中断操作等待
  • 如果ActiveDialog不在该列表-->中,则表示没有提示
    • 我返回中断操作恢复

下面的工作正常很好

  • 对话框A正在运行
  • 对话框A提示用户一个问题
  • 用户键入“Help”并触发中断
  • 帮助对话框运行并向用户显示菜单,然后完成
  • 将触发RepromptDialogAsync(),并再次询问用户未回答的提示
下面的无效

  • 对话框B正在运行
  • 在对话框B的最后一步
    • 我们结束对话框-->等待EndDialogAsync()
    • 我们开始对话C-->返回等待sc.BeginDialogAsync(“对话C”)
  • 对话框C正在运行,并提示用户一个问题
  • 用户键入“Help”并触发中断
  • 帮助对话框运行并向用户显示菜单,然后完成
  • 预计对话框C的提示将被重新提示,但
    • 错误:DialogSet.RepromptDialogAsync():找不到id为“dialog C”的对话框
以前有人遇到过这个问题吗

谢谢你,

Marc

我假设问题在下面,我建议检查调试程序中的Context.Dialogs和Context.Parent.Dialogs。我怀疑问题是由于启动对话框的上下文造成的。您可能正试图从“主”上下文(对于我
dc
)中重新编译对话框,但该对话框不存在,因为您是从瀑布(对于我
step
)启动它的。我在尝试从瀑布内部取消所有对话框时遇到了这个问题,必须使用
step.parent.cancelAllDialogs()。也就是说,我有一个类似的中断重新编译,没有遇到这个问题。我只是使用了
dc.repromptDialog()
,所以我不确定这是否对您有帮助。另外,我的主对话框是ActivityHandler的一部分,而不是ComponentDialog。我的中断函数在我的主bot.js文件中。我是故意这么做的,所以我的代码是这样的:
if(topIntent===HELP\u intent&topIntentScore>0.5){wait dc.context.sendActivity(helpMessage);wait dc.repromptDialog();return true;}
@MarcAsmar我将开始进行一些测试/调试,但我相信可能发生的情况是,在调用“帮助”的中断之前,DialogState没有被保存。如果您在对中断执行操作之前手动保存DialogState?…或调用
EndDialog
将从对话框堆栈中删除对话框C,我认为这更可能。您可以不调用
EndDialog
,而只使用
return wait sc.BeginDialogAsync(“Dialog C”)