gpt4 book ai didi

c# - Microsoft BotFramework v4 任务计划和状态

转载 作者:行者123 更新时间:2023-12-03 01:04:00 24 4
gpt4 key购买 nike

我正在使用 Microsoft 的 botframework v4 来构建机器人。我已经实现了一个延迟任务来检查用户是否在过去 2 小时内没有回复。如果达到 2 小时超时,该函数将执行一些操作并重置对话状态。这工作正常,但有两个问题:

  1. 如果用户已通过对话框手动重置对话,我无法取消此任务。
  2. 延迟任务中的状态不会更新。例如,如果用户将注释添加到列表中,则延迟任务内的状态在对话结束时为 0。

我的延迟任务代码:

 EndConversation = Task.Delay(600000).ContinueWith(async (t) =>
{
bool wordGenerated = false;
xyzState = await GetXYZState(dialogContext);

if (xyzState.ListCount > 0)
{
//retry 4 times sending the word document
for (int i = 0; i < 4; i++)
{
if (await GenerateWordDocument.CreateDoc(dc, _xyzAccessor, _xyzAccessor2))
{
wordGenerated = true;
break;
}
}
}...

最佳答案

首先我要指出的是,在机器人内部启动长期存在的Task并不是一个可扩展性很强的解决方案。与 Web 应用程序一样,机器人往往会跨多个服务器横向扩展,并且还必须能够容忍进程或服务器重新启动。您可能希望使用某种外部分布式计时器系统,以确保无论您的机器人的生命周期如何,计时器都将被持久化并最终被调用。除此之外,它也没有充分利用机器资源。如果您的机器人有 100 个或希望有 1000 个用户,并且您不断使用 Task::Delay 创建 Task,那么您将产生相当多的开销资源方面。通常,这样的解决方案是拥有一个由单个工作人员提供服务的计时器存储。

好吧,先把警告放在一边,让我们谈谈您面临的具体问题:

  1. I can not cancel this task if the user has already resetted the conversation manually over the dialogs.

嗯,你可以...你只需创建一个配套的 CancellationTokenSource,将其 Token 传递给 Task.DelayContinueWith,然后,如果您想取消它,请调用其 Cancel 方法,该方法将释放延迟计时器并确保它永远不会被调用。

我不知道示例代码中的 EndConversation 到底是什么,但它现在需要是一个包含以下内容的数据结构,而不仅仅是一个 Task其上的 TaskCancellationToken 。一个简单的元组可以在这里工作,否则您自己创建一个新类。

  1. The states in the Delay Task are not updated. As example, if the user adds a note to a list, the State inside the delay task is 0 at the end of the conversation.

是的,所以您看到的是陈旧状态,因为您正在使用延续来关闭原始 dialogContext 变量。从技术上讲,您不应该在当前回合之外使用诸如 DialogContextITurnContext 之类的内容。

您在这里尝试做的是所谓的主动消息传递。即使您的逻辑实际上并未向用户回复消息,相同的概念也适用。因此,您想要做的实际上是捕获闭包外部的 ConversationReference 以便继续进行,然后在闭包内部使用该 ConversationReference 以便稍后继续对话。看起来有点像这样:

// Capture the conversation reference from the current turn's activity
var currentConversationReference = dialogContext.Context.Activity.GetConversationReference();

// Capture the adapter of the current turn (this is fugly, but kind of the best way to do it right now)
var botAdapter = dialogContext.Context.Adapter;

// Kick off your timer with the continuation closing over these variables for later use
Task.Delay(600000).ContinueWith(async (t) =>
{
await botAdapter.ContinueConversationAsync(
YourBotsApplicationId,
currentConversationReference,
(proactiveTurnContext, ct) => {
// Now you can load state from the proactive turn context which will be linked to the conversation reference provided
var xyzState = await GetXYZState(proactiveTurnContext);

// Example of sending a message through the proactive turn context
await proactiveTurnContext.SendActivityAsync("Hi, I just did a thing because I didn't hear from you for two hours.");
});
}

关于c# - Microsoft BotFramework v4 任务计划和状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54170482/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com