Bot 框架 v4 如何在对话框中等待用户响应提示

Bot framework v4 how to wait within a dialog for user to respond to a prompt

在主提示中,我想调用提示用户输入的子对话框 (ChoicePrompt),将结果保存到变量并使用该结果。

在示例代码中,实际最终发生的是子对话框被触发,但主对话框中的代码在子对话框完成之前(在用户输入之前)继续。

我想要实现的示例代码:

private async Task<DialogTurnResult> IntentCheckStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    LuisResult = await InDocRecognizer.RecognizeAsync<InDocChatbotService>(stepContext.Context, cancellationToken);
    var topIntent = LuisResult.TopIntent().intent;
    if (LuisResult.TopIntent().score < 0.30)
    {
        topIntent = InDocChatbotService.Intent.None;
    }
    // if first and second option is close in score prompt user choice between them
    else if (LuisResult.Intents.ElementAt(0).Value.Score - LuisResult.Intents.ElementAt(1).Value.Score < 0.20)
    {
        var topIntent = await stepContext.BeginDialogAsync(nameof(ChooseIntentDialog), LuisResult, cancellationToken);
        // Code in this dialog continues before user gives input to child dialog "ChooseIntentDialog"
    }

    // DO MORE STUFF WITH VARIABLE topIntent
}        

我确实有一个解决方法,但它很丑陋并且破坏了代码风格。我这样做的方法是 return 子对话框,然后在主对话框的另一个瀑布步骤中处理 ChooseIntentDialog 中的内容。

这很糟糕,因为我需要将多个变量带到那个瀑布步骤,这似乎完全没有必要。如果我可以让瀑布步骤等待子对话框,并且 return 它的结果不需要另一个瀑布步骤。

这可能吗?如果不是,还有什么替代方案,因为我的解决方案在代码方面似乎不是很有效。

您不能 return 到瀑布对话框中某个步骤的中间。如果您 return await stepContext.BeginDialogAsync(nameof(ChooseIntentDialog)...) 然后在 return await stepContext.endDialogAsync(topIntent) 中返回所选值(如果需要做出选择),或者从主对话框中使用 return await stepContext.next(topIntent) 如果不需要,您将可以访问下一步 stepContext.result 中的最高意图。您只需将 // DO MORE STUFF WITH VARIABLE topIntent 移至下一步即可。