Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Microsoft Bot framework中创建新的IDialogContext实例?_C#_Frameworks_Bots_Botframework_Azure Language Understanding - Fatal编程技术网

C# 如何在Microsoft Bot framework中创建新的IDialogContext实例?

C# 如何在Microsoft Bot framework中创建新的IDialogContext实例?,c#,frameworks,bots,botframework,azure-language-understanding,C#,Frameworks,Bots,Botframework,Azure Language Understanding,我需要重置或终止(使用context.Done)当前IDialogContext实例,创建一个新实例,并在不同的函数中使用它。我如何创建这样一个实例,IDialogContext是一个接口。可能吗 这是am试图从中调用函数“selfredirect” private async Task ApprovalConfirm(IDialogContext上下文,IAwaitable结果) { var消息=等待结果; xxxticket xxxticketobject=新的xxxticket(); if

我需要重置或终止(使用context.Done)当前IDialogContext实例,创建一个新实例,并在不同的函数中使用它。我如何创建这样一个实例,IDialogContext是一个接口。可能吗

这是am试图从中调用函数“selfredirect”

private async Task ApprovalConfirm(IDialogContext上下文,IAwaitable结果)
{
var消息=等待结果;
xxxticket xxxticketobject=新的xxxticket();
if(message.Text.Contains(“是”))
{
xxxticketobject=context.ConversationData.Get(“xxxcard”);
如果(xxxticketobject.action==“批准”)
等待上下文。PostAsync(“已接受”);
其他的
等待上下文。PostAsync(“已拒绝”);
context.ConversationData.RemoveValue(“xxxfinalcard”);
context.Reset();//*这就是我要做的…清除context,然后调用以下函数*
等待SelfRedirect(context,context.UserData.Get(“CurrentQuery”),“Approval”);
}
else if(message.Text==“否”)
{
等待上下文。PostAsync(“谢谢”);
上下文。完成(上下文);
}
其他的
等待SelfRedirect(context,context.UserData.Get(“CurrentQuery”),null);
}

自动重定向功能

  public static async Task SelfRedirect(IDialogContext context, string msg, string intent=null)
    {
        try
        {
            DialogLuis LUISDialog = new DialogLuis();
            IMessageActivity message = context.MakeMessage();
            message.Text = msg;
            var tasks = LUISDialog.services.Select(s => s.QueryAsync(message.Text, context.CancellationToken)).ToArray();
            var results = await Task.WhenAll(tasks);
            var winners = from result in results.Select((value, index) => new { value, index })
                          let resultWinner = LUISDialog.BestIntentFrom(result.value)
                          where resultWinner != null
                          select new LuisServiceResult(result.value, resultWinner, LUISDialog.services[result.index]);
            if (intent != null)
            {
                winners = from result in results.Select((value, index) => new { value, index })
                          let resultWinner = new IntentRecommendation(intent)
                          where resultWinner != null
                          select new LuisServiceResult(result.value, resultWinner, LUISDialog.services[result.index]);
            }
            var winner = LUISDialog.BestResultFrom(winners);
            if (winner == null)
            {
                throw new InvalidOperationException("No winning intent selected from Luis results.");
            }
            if (winner.Result.Dialog?.Status == DialogResponse.DialogStatus.Question)
            {
                var childDialog = await LUISDialog.MakeLuisActionDialog(winner.LuisService,
                                                             winner.Result.Dialog.ContextId,
                                                             winner.Result.Dialog.Prompt);
                context.Call(childDialog, LUISDialog.LuisActionDialogFinished);
            }
            else
            {
                IAwaitable<IMessageActivity> item = null;
                await LUISDialog.DispatchToIntentHandler(context, item, winner.BestIntent, winner.Result);
            }
        }
        catch (Exception ex) { CommonMethods.LogTime("", ex, context); }
    }
公共静态异步任务SelfRedirect(IDialogContext上下文,字符串msg,字符串intent=null)
{
尝试
{
DialogLuis LUISDialog=新建DialogLuis();
IMessageActivity message=context.MakeMessage();
message.Text=msg;
var tasks=LUISDialog.services.Select(s=>s.querysync(message.Text,context.CancellationToken)).ToArray();
var结果=等待任务.WhenAll(任务);
var winners=来自结果中的结果。选择((值,索引)=>new{value,index})
让resultWinner=LUISDialog.BestIntentFrom(result.value)
其中resultWinner!=null
选择新的LuisServiceResult(result.value、resultWinner、LUISDialog.services[result.index]);
if(intent!=null)
{
winners=来自结果中的结果。选择((值,索引)=>new{value,index})
let resultWinner=新意向推荐(意向)
其中resultWinner!=null
选择新的LuisServiceResult(result.value、resultWinner、LUISDialog.services[result.index]);
}
var winner=LUISDialog.BestResultFrom(winners);
如果(获胜者==null)
{
抛出新的InvalidOperationException(“没有从Luis结果中选择获胜意图”);
}
if(winner.Result.Dialog?.Status==DialogResponse.DialogStatus.Question)
{
var childDialog=wait LUISDialog.MakeLuisActionDialog(winner.LuisService,
winner.Result.Dialog.ContextId,
winner.Result.Dialog.Prompt);
调用(childDialog、LUISDialog.LuisActionDialogFinished);
}
其他的
{
IAwaitable item=null;
等待LUISDialog.DispatchToIntentHandler(上下文、项目、winner.BestIntent、winner.Result);
}
}
catch(异常ex){CommonMethods.LogTime(“,ex,context);}
}
但是我不能在重置后使用重定向功能,因为堆栈是空的。请帮忙

让我解释一下为什么我必须使用selfredirect函数而不是context.wait(MessageReceived)通过这个小函数

private async Task ApprovalConfirm(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        var message = await result;
        if (message.Text == "no")
        {
            await context.PostAsync("Thank you");
            context.Done(context);
        }
        else if (message.Text == "yes")
        {
            await context.PostAsync("yes");
            context.Done(context);
        }
        else
        {
            context.Wait(MessageReceived);
        }
    }
private async Task ApprovalConfirm(IDialogContext上下文,IAwaitable结果)
{
var消息=等待结果;
如果(message.Text==“否”)
{
等待上下文。PostAsync(“谢谢”);
上下文。完成(上下文);
}
else if(message.Text==“是”)
{
等待上下文。PostAsync(“是”);
上下文。完成(上下文);
}
其他的
{
Wait(MessageReceived);
}
}
我的用例是这样的,如果用户键入yes,则bot应该返回yes,如果用户键入no,则bot应该返回thankyou。如果用户输入“Hi”,机器人应该通过Luis找到Hi的答案,Luis会找到新的问候意图并返回Hi用户

这里,如果我输入user context.Wait(MessageReceived),则bot将只等待用户的下一个查询

对话的结构

  [LuisIntent("Approval")]
    public async Task Approval(IDialogContext context, LuisResult result)
    {
        context.ConversationData.SetValue("currentIntent", "Approval");
        .
        .
        .
        PromptDialog.Choice<string>(context, ApprovalList, ...);
    }


private async Task ApprovalList(IDialogContext context, IAwaitable<string> result)
    {
        try
        {
            var request_type = await result;
            .
            .
            context.Wait(ApprovalResponse);
            }
        }
        catch (Exception ex)
        {
            CommonMethods.LogTime("ApprovalList", ex, context);
        }
    }
 private async Task ApprovalResponse(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        var message = await result;
       .
       .
       .
            context.Wait(AfterApprovalComment);
        }
        catch (Exception ex)
        {
            CommonMethods.LogTime("ApprovalResponse", ex, context);
            await context.PostAsync("out of approvals...");
            context.Done(context);
        }
    }


private async Task ApprovalConfirm(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        var message = await result;
       .
       .
       .
    await SelfRedirect(context, context.UserData.Get<string>("CurrentQuery"), "Approval");
    }
[LuisIntent(“批准”)]
公共异步任务批准(IDialogContext上下文,LuisResult结果)
{
context.ConversationData.SetValue(“currentIntent”、“Approval”);
.
.
.
PromptDialog.Choice(上下文、批准列表等);
}
私有异步任务批准列表(IDialogContext上下文,IAwaitable结果)
{
尝试
{
var请求类型=等待结果;
.
.
Wait(ApprovalResponse);
}
}
捕获(例外情况除外)
{
CommonMethods.LogTime(“ApprovalList”,例如,上下文);
}
}
专用异步任务ApprovalResponse(IDialogContext上下文,IAwaitable结果)
{
var消息=等待结果;
.
.
.
context.Wait(AfterApprovalComment);
}
捕获(例外情况除外)
{
通用方法。日志时间(“批准响应”,例如,上下文);
wait context.PostAsync(“未获得批准…”);
上下文。完成(上下文);
}
}
私有异步任务ApprovalConfirm(IDialogContext上下文,IAwaitable结果)
{
var消息=等待结果;
.
.
.
等待SelfRedirect(context,context.UserData.Get(“CurrentQuery”),“Approval”);
}

基于我们在Common中的讨论
  [LuisIntent("Approval")]
    public async Task Approval(IDialogContext context, LuisResult result)
    {
        context.ConversationData.SetValue("currentIntent", "Approval");
        .
        .
        .
        PromptDialog.Choice<string>(context, ApprovalList, ...);
    }


private async Task ApprovalList(IDialogContext context, IAwaitable<string> result)
    {
        try
        {
            var request_type = await result;
            .
            .
            context.Wait(ApprovalResponse);
            }
        }
        catch (Exception ex)
        {
            CommonMethods.LogTime("ApprovalList", ex, context);
        }
    }
 private async Task ApprovalResponse(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        var message = await result;
       .
       .
       .
            context.Wait(AfterApprovalComment);
        }
        catch (Exception ex)
        {
            CommonMethods.LogTime("ApprovalResponse", ex, context);
            await context.PostAsync("out of approvals...");
            context.Done(context);
        }
    }


private async Task ApprovalConfirm(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        var message = await result;
       .
       .
       .
    await SelfRedirect(context, context.UserData.Get<string>("CurrentQuery"), "Approval");
    }