代码之家  ›  专栏  ›  技术社区  ›  Waqas Zia

已在不调用上下文的情况下调用ResumeAfter方法。在下一个对话框中完成

  •  0
  • Waqas Zia  · 技术社区  · 6 年前

    我已经实现了一个结构,其中QnA对话框是第一次启动的。如果QnA对话框无法解决问题,则会启动一个定义了一些主要功能的Luis对话框。基于这些主要功能,我启动了可以解决问题的特定对话框。

    我的问题是,当我尝试从QnAMaker启动LuisDialog时,它会启动另一个LuisDialog以进行对话,该对话框不会使用wait方法停止,并在执行后立即自动调用ResumeAfter方法。

    QnADialog:

    protected override async Task RespondFromQnAMakerResultAsync(IDialogContext context, IMessageActivity message, QnAMakerResults results)
    {
        if (results == null || results.Answers.Count==0 || !IsConfidentAnswer(results) || results.Answers.FirstOrDefault().Score<0.75) {
            await context.Forward(new MainLuisDialog(), MessageReceived, context.Activity.AsMessageActivity(), CancellationToken.None);
    
        }
    }
    

    第一个Luis对话框:

    [LuisIntent(ErrorFileLink)]
    public async Task ErrorFileLinkIntentHandler(IDialogContext context, LuisResult result) {
        await context.Forward(new ErrorFileLinkDialog(), CallBackHandler, context.Activity.AsMessageActivity(), CancellationToken.None);
    }
    
    private async Task CallBackHandler(IDialogContext context, IAwaitable<object> result)
    {
        try {
            var returnedResult = await result;
            if (returnedResult as string == "done")
                context.Done(false);
        }
        catch (Exception e) {
        }
    }
    

    第二个Luis对话框:

    [LuisIntent(MainAppIntent)]
    public async Task MainAppIntentHandler(IDialogContext context, LuisResult result)
    {
        if(context.GetPrivateConversationData<SyncIssueStates>(CurrentDialogState) == SyncIssueStates.ExpectingSyncCompleteMessage)
        {
            await context.PostAsync(Utility.GetResourceString("SYNC_ISSUE_PLEASE_WAIT_SYNC_COMPELTE"));
            context.Wait(MessageReceived);
            return;
        }
        await context.PostAsync(Utility.GetResourceString("SYNC_ISSUE_GET_ERROR_MESSAGE"));
        context.SetPrivateConversationData(CurrentDialogState, SyncIssueStates.ExpectingErrorMessage);
        context.Wait(MessageReceived);
    }
    

    第一个Luis对话框中的CallBackHandler方法在执行Forward之后立即调用。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Nicolas R    6 年前

    我认为这种行为是由于 QnAMakerDialog公司 呼叫 context.Done(true); 内部 DefaultWaitNextMessageAsync 方法参考号: https://github.com/Microsoft/BotBuilder-CognitiveServices/blob/master/CSharp/Library/QnAMaker/QnAMaker/QnAMakerDialog.cs#L203

    尝试重写 DefaultWaitNextMessageAsync 方法:

    protected override async Task DefaultWaitNextMessageAsync(IDialogContext context, IMessageActivity message, QnAMakerResults results)
    {
        if (results == null || results.Answers.Count == 0 || !IsConfidentAnswer(results) || results.Answers.FirstOrDefault().Score < 0.75)
        {
            await context.Forward(new FirstDialog(), AfterForward, context.Activity.AsMessageActivity(), CancellationToken.None);
            context.Wait(base.MessageReceivedAsync);
        }
        else
        {
            await base.DefaultWaitNextMessageAsync(context, message, results);
        }
    }