【问题标题】:Bot Framework: How to wait for background task?Bot Framework:如何等待后台任务?
【发布时间】:2020-06-14 09:27:33
【问题描述】:

我想在 Bot Framework 操作中运行后台任务,例如运行 Azure 自动化作业或向人员发送批准请求。 目标是机器人应该只在后台任务完全完成后回复用户,在这种情况下,当 Azure 自动化作业成功完成或人工批准请求时。

我的机器人正在使用自定义 DirectLine 通道,如果与用户的通信是异步的,这不是问题,用户不会期望机器人立即回复。 如何让 Bot Framework 在向用户发送回复之前等待后台任务完成?

【问题讨论】:

  • 您好乔纳斯,感谢您的回复。是的,我做到了,但我预计在我的情况下等待可能会很长。后台任务完成之前的几分钟到几小时不等,具体取决于自动化作业的类型或人员的可用性。我相信 async/await 语句不会让我的机器人等待这么久?由于我的机器人在 Azure Functions 上运行,我也不想让机器人逻辑主动等待这么久,因为我要支付每秒的资源消耗。如果我误解了,请告诉我?

标签: c# botframework chatbot azure-bot-service direct-line-botframework


【解决方案1】:

对于 OP 来说可能有点太晚了,但对于到达这里的其他人来说可能是相关的。

几个月前,我制作了一个机器人,它必须等待后台进程(使用 Power BI Embedded 构建报告并生成它的图像)并将该图像返回给用户。

在我的例子中,后台进程非常适合使用BackgroundService 类作为托管服务的进程内后台服务,以及用于准备数据并通过Channel 将其发送到后台服务的自定义操作。

最后,工作完成后,服务使用 Bot Framework SDK 中的 ContinueConversationAsync 方法将信息返回给用户。

您可以在我的GitHub repo 中查看所有实现细节。相关的部分是custom action 和service 本身。

【讨论】:

    【解决方案2】:

    您正在寻找的方法称为主动消息传递。首先,您保存对话参考,当您的后台任务完成后,您可以利用此参考发送您的消息。

    微软文档:Send proactive notifications to users

    【讨论】:

    • 谢谢,看来这确实可行!我是否仍需要立即从机器人向用户发回一条消息,上面写着“我正在处理这个问题,我完成后会回复你”,还是可以什么都不返回在后端进程完成之前给用户?我更喜欢在主动消息指示进程完成之前不向用户发送任何内容的选项,因为我的频道类似于邮件,机器人不需要立即回复。
    • 我想我自己想出了最后一个问题:看起来我不必立即发送回复来确认消息已收到,我可以将消息转发给外部服务.每当外部服务完成时,它可以使用主动消息在对话中回复用户。感谢您的帮助!
    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    相关资源
    最近更新 更多