检测对话何时结束,以便我可以删除存储的对话状态数据

Detect when conversation end so I can delete stored conversation state data

我设置了一个机器人,它有一个正常的对话框堆栈,每个对话框在 Azure 的 Cosmos DB 中存储一些状态数据。当对话结束时,我使用 OnEndDialogAsync 删除特定于该对话的数据。

我的问题是,如何检测整个对话何时结束以便删除整个对话?还是对话永远不会结束?

我当前删除每个对话框数据的代码:

    protected override async Task OnEndDialogAsync(ITurnContext context, DialogInstance instance, DialogReason reason, CancellationToken cancellationToken)
    {
        DialogStateDictionary dictionary = await Dependencies.StateAccessor.GetAsync(context, () => null);
        if (dictionary != null && dictionary.ContainsKey(DialogID) == true)
        {
            dictionary[DialogID] = null;
        }
        await Dependencies.StateAccessor.SetAsync(context, dictionary);
    }

删除整个内容的代码是:

await Dependencies.StateAccessor.SetAsync(context, null);

对话的概念 "ending" 将因频道而异。在网络聊天中,您可以让您的客户端通过让您的机器人知道来响应浏览器离开页面。在 Teams 等渠道中,对话实际上是永久性的,但您始终可以通过让机器人像您正在做的那样重置其状态,将对话中的任何点任意定义为 "end"。也许你可以有一个确认提示,询问用户 "Will that be all?",如果用户说 "yes" 那么机器人可以说 "Goodbye" 或什么的。

不确定您使用的是哪个频道,建议查看endofconversation activity类型。