我正在研究.NET中的机器人.我有一个scorable,我想从一个对话框D1,然后最终得到一个空堆栈.或者用另一种方式,我想发射一个新的对话框,但不是打断然后恢复我所处的位置(像最可靠的例子),最后得到一个空白的对话框(如取消可行的例子).
可能相关点:它触发的对话框(D1)依次在堆栈上放置另一个对话框(D2),我也希望在堆栈清除之前正常工作.
有一个取消可行的例子:https://docs.microsoft.com/en-us/bot-framework/dotnet/bot-builder-dotnet-global-handlers .其目的是清除对话框堆栈.
我想这样做,但先调用另一个对话框.我在我的scorable的PostAsync()方法中试过这个:
var interruption = dialog_D1.Void<object, IMessageActivity>();
_task.Call(interruption, null);
await _task.PollAsync(token);
_task.Reset();
Run Code Online (Sandbox Code Playgroud)
然而,只要D1调用D2,就会触发PollAsync()并清除对话框堆栈.这意味着当您响应D2时,堆栈为空,RootDialog接受输入.
我也在我的scorable的PostAsync()方法中试过这个:
var interruption = dialog_D1.Void<object, IMessageActivity>();
_task.Call(interruption, AfterCallingDialog);
await _task.PollAsync(token);
...
private async Task AfterCallingDialog(IDialogContext context, IAwaitable<object> result)
{
_task.Reset();
}
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,机器人错误地出现"IDialog方法执行完成了通过IDialogStack指定的多个简历处理程序".一击到_task.Call()
任何人都可以建议修复此问题或让我知道一个不同的方法?
谢谢!
背风处
有趣的是,你可以花几天时间观察某件事,然后一旦你发布它就会发现答案。这对我有用:
_task.Call(dialog_D1.Do(AfterChildDialog), null);
await _task.PollAsync(token);
...
private async Task AfterChildDialog(IBotContext arg1, IAwaitable<object> arg2)
{
_task.Reset();
}
Run Code Online (Sandbox Code Playgroud)