从Scorable,如何调用对话框然后清除堆栈?

时间:2017-09-07 07:28:01

标签: c# botframework

我正在研究.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();

然而,只要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();
}

但是在这种情况下,使用IDialogStack指定的多个简历处理程序完成了&#34; IDialog方法执行的机器人错误。&#34;一旦它命中_task.Call()

有人可以建议解决这个问题,或者让我知道一种不同的方法吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

有趣的是,你可以在几天内看到某些东西,然后一发帖就会发现答案。这对我有用:

_task.Call(dialog_D1.Do(AfterChildDialog), null);
await _task.PollAsync(token);

...

private async Task AfterChildDialog(IBotContext arg1, IAwaitable<object> arg2)
{
    _task.Reset();
}