C# 如何在cancel scorable中检测顶级bot框架对话框

C# 如何在cancel scorable中检测顶级bot框架对话框,c#,botframework,C#,Botframework,我正在使用cancel scorable捕获关键字quit和cancel,并使用Task.Fail使当前对话框失败。该示例使用Task.Reset,但这会展开整个堆栈,这在多级堆栈中是不可取的 所以Task.Fail工作正常,我抛出一个OperationCanceledException并在调用对话框中吞下它,但是我的问题是如果我的顶级对话框失败,那么我的机器人就会崩溃 我如何从scorable中判断我是否在堆栈的顶部(在这种情况下,我将忽略消息),或者是否有更好的方法来处理取消单个对话框 请注

我正在使用cancel scorable捕获关键字quit和cancel,并使用Task.Fail使当前对话框失败。该示例使用Task.Reset,但这会展开整个堆栈,这在多级堆栈中是不可取的

所以Task.Fail工作正常,我抛出一个OperationCanceledException并在调用对话框中吞下它,但是我的问题是如果我的顶级对话框失败,那么我的机器人就会崩溃

我如何从scorable中判断我是否在堆栈的顶部(在这种情况下,我将忽略消息),或者是否有更好的方法来处理取消单个对话框

请注意,我看到有一个框架集合被传递,我想这可能会有所帮助,但在顶层设置为4,而不是我预期的0,我不确定这是否是一个可靠的来源

下面是我对根对话框的实例化

    internal static IDialog<object> MakeRootDialog()
    {
        return Chain.From(() => new LuisDialogHome())
            .Do(async (context, dialog) =>
            {
                try
                {
                    await dialog;
                }
                catch (Exception e)
                {
                    await context.PostAsync($"Error from home dialog: {e.Message}");
                }
            });
    }

    protected override async Task PostAsync(IActivity item, string state, CancellationToken token)
    {
        // This will unwind the entire stack and take you right back to the top which we dont want so Fail the task instead to undo one layer
        //            this.task.Reset();
        this.task.Fail(new OperationCanceledException($"Cancelled"));
    }
内部静态IDialog MakeRootDialog()
{
返回链。从(()=>new LuisDialogHome())
.Do(异步(上下文、对话框)=>
{
尝试
{
等待对话;
}
捕获(例外e)
{
wait context.PostAsync($“来自主对话框的错误:{e.Message}”);
}
});
}
受保护的覆盖异步任务PostAsync(IActivity项、字符串状态、CancellationToken令牌)
{
//这将解开整个堆栈,并将您带回到顶部,我们不希望这样做失败的任务,而不是撤消一层
//this.task.Reset();
this.task.Fail(新操作取消异常($“已取消”);
}

以及我的可取消问题任务。失败,这将导致调用上述异常处理程序,并将“对不起,我的bot代码有问题”消息发送给用户。

我就是这样做的,我以这种方式从对话中的任何一点开始对“取消”一词进行了嘲笑

您还需要在Golbal.asax中添加类似的内容

       var builder = new ContainerBuilder();
        builder.RegisterType<CancelScorable>()
            .As<IScorable<IActivity, double>>()
            .InstancePerLifetimeScope();

        builder.Update(Conversation.Container);`
var builder=newcontainerbuilder();
builder.RegisterType()
.As()
.InstancePerLifetimeScope();
builder.Update(Conversation.Container)`

我就是这样做的,我用这种方式对“取消”一词进行了嘲讽,你可以从对话的任何一点重新开始

您还需要在Golbal.asax中添加类似的内容

       var builder = new ContainerBuilder();
        builder.RegisterType<CancelScorable>()
            .As<IScorable<IActivity, double>>()
            .InstancePerLifetimeScope();

        builder.Update(Conversation.Container);`
var builder=newcontainerbuilder();
builder.RegisterType()
.As()
.InstancePerLifetimeScope();
builder.Update(Conversation.Container)`

你能发布复制问题的机器人程序代码吗?你能发布复制问题的机器人程序代码吗?这是可行的,但是如果对话不断抛出,你就会陷入循环,因此你必须适应这种情况。因为这个原因,我没有使用这个。我(有点黑客)使用任务的帧数,如果它有效,但是如果对话不断抛出,你就会进入一个循环,因此必须适应这种情况。因为这个原因,我没有使用这个。我(有些黑客)使用任务的帧数,如果
       var builder = new ContainerBuilder();
        builder.RegisterType<CancelScorable>()
            .As<IScorable<IActivity, double>>()
            .InstancePerLifetimeScope();

        builder.Update(Conversation.Container);`