1

我目前正在玩 Bots 和 LUIS。所以我有一个正在运行的机器人。在我的 RootDialog 中,我处理从 LUIS 获得的所有意图。现在我想检查一个实体是否缺少意图。

 if (result.Entities.Count == 0) {
 var ct = new CancellationToken();
 await context.Forward(new ParameterDialog(), ResumeAfterParameterDialog, message, ct);

如果没有实体,我将创建一个新的子对话框。

public class ParameterDialog : IDialog<object> {
        public async Task StartAsync(IDialogContext context) {
            context.Wait(MessageReceivedAsync);
    }



    public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument) {

        argument = new PromptDialog.PromptString("Please enter a parameter", "please try again", 2);

        var prompt = await argument;

        await context.PostAsync($"Your Parameter is: {prompt}");
        context.Done(prompt);
    }             
}

如果我可以获得用户输入,我会将其传递回我的父对话框。

现在我真的不知道如何停止 Bot 并让它等待用户输入。有人可以解释我如何做到这一点吗?谢谢!

4

1 回答 1

3

您缺少context.Call正在创建的 PromptString 对话框。

context.Call方法需要一个对话框和一个“回调”方法(ResumeAfter),一旦对话框完成(在这种情况下,当 PromptString 完成时)将被调用。

在您的场景中,您的代码应如下所示:

public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument) 
{
   var dialog = new PromptDialog.PromptString("Please enter a parameter", "please try again", 2);

   context.Call(dialog, ResumeAfterPrompt)
}

private Task ResumeAfterPrompt(IDialogContext context, IAwaitable<string> result)
{
    var parameter = await result;
    context.Done(parameter);
}
于 2016-11-18T16:09:32.063 回答