- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Microsoft 的 botframework v4 来构建机器人。我已经实现了一个延迟任务来检查用户是否在过去 2 小时内没有回复。如果达到 2 小时超时,该函数将执行一些操作并重置对话状态。这工作正常,但有两个问题:
我的延迟任务代码:
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
,那么您将产生相当多的开销资源方面。通常,这样的解决方案是拥有一个由单个工作人员提供服务的计时器存储。
好吧,先把警告放在一边,让我们谈谈您面临的具体问题:
- I can not cancel this task if the user has already resetted the conversation manually over the dialogs.
嗯,你可以...你只需创建一个配套的 CancellationTokenSource
,将其 Token
传递给 Task.Delay
并ContinueWith
,然后,如果您想取消它,请调用其 Cancel
方法,该方法将释放延迟计时器并确保它永远不会被调用。
我不知道示例代码中的 EndConversation
到底是什么,但它现在需要是一个包含以下内容的数据结构,而不仅仅是一个 Task
其上的 Task
和 CancellationToken
。一个简单的元组可以在这里工作,否则您自己创建一个新类。
- 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
变量。从技术上讲,您不应该在当前回合之外使用诸如 DialogContext
或 ITurnContext
之类的内容。
您在这里尝试做的是所谓的主动消息传递。即使您的逻辑实际上并未向用户回复消息,相同的概念也适用。因此,您想要做的实际上是捕获闭包外部的 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/
我有一个 k*n矩阵 X 和 k*k矩阵A。对于X的每一列,我想计算标量 X[:, i].T.dot(A).dot(X[:, i]) (或者,数学上, Xi' * A * Xi )。 目前,我有一个
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我是 VueJS 的新手。我已经使用 vuetify/webpack-ssr 模板创建了一个项目,现在我想创建一个登录页面,但是没有显示表单,控制台给了我以下信息: [Vue warn]: Unkno
我尝试将 value 插入到 C++ vector v 之前的第 i 元素(或元素 (i-1) 之后) )。代码很简单 v.insert(v.begin() + i, value); 我确信当 i 介
我需要显示使用合并排序算法排序的 vector 。然而,当我使用 v.begin() 时,我的 friend 使用 v.data() 来传递 vector 。他的代码运行良好,而我的却不行。请解释。
这是我的命令(url1、url2、url3、url4 是占位符): ffmpeg -i url1 -i url2 -i url3 -i url4 -filter_complex “[1:v:0] [1
我以前用过Vue,我知道怎么用v-for渲染元素序列,v-if或v-show有条件地显示元素,并且 v-model例如,控制段落的内容。 但现在我需要对 DOM 进行更精细的控制: 我有一个range
我正在学习所有权和借用。 borrow1 和borrow2 的区别在于在borrow2 打印时使用了&: fn borrow1(v: &Vec) { println!("{}", &v[10]
我找不到一种方法来选择不同的选项来渲染 v-for 中的文本。是否有可能或者我是否需要以不同的方式构建逻辑来执行类似于下面的代码的操作? // i
Iterable 的三个直接子类型是 Map , Seq , 和 Set .除了性能问题之外,似乎还有一个 Seq是从整数到值的映射,以及 Set是从值到 bool 值的映射(如果值在集合中,则为 t
我想应用一个计算方法,如果键存在则增加值,否则将 1。有 Map map = new HashMap<>(); 我不明白为什么 for (int i = 0; i v != null ? v++ :
标准(IEEE 754/C)是否保证以下代码断言永远不会失败? int main() { for ( /* all possible float / double values */ )
代码由Vue语言编写,使用Element-ui框架, 如果一个对象包含某些内容,则会显示该内容,如果不包含则禁用菜单按钮。 输出应该是这样的: a、b(禁用)、c、d、e 但我的是这样的: a、a(禁
如果我这样做: {{ morevalue }} {{ value }} v-else 中的跨度也会在第二个 V-FOR 上循环,即使它上面没有任何 v-for,为什么? 这是
如果我这样做: {{ morevalue }} {{ value }} v-else 中的跨度也会在第二个 V-FOR 上循环,即使它上面没有任何 v-for,为什么? 这是
我将 Vue.js 与 Vuetify 一起使用,我正在尝试使用 v-data-table 从后端加载菜单列表并使用 对其设置一些权限v-switches 但我在尝试 v-model 数组时遇到问题:
我在 Java 的流式操作中努力维护我想要的数据结构,这很可能是由于缺乏正确的理解和实践。 public class Main { public static void main(String
我正在尝试为匹配中的每个匹配呈现一些 HTML,但是,我不太确定 实际上是正确的。 更具体地说,我不确定我是否可以使用 v-bind:match='match'在与循环相同的元素上 v-for='ma
所以我想知道为什么这个 v-if 和 v-else 语句不起作用,为什么我要以不同的方式解决它。 代码如下 Required: Select a Workflow {{ isChain ?
我有一个 VueJS 组件 ,我在同一个模板中使用了两次来显示两组不同的数据。每个都显示在自己的 使用 v-if 切换的容器在导航选项卡上。 似乎这些组件被实例化为同一个实例。我调用 console
我是一名优秀的程序员,十分优秀!