当前位置: 首页 > 知识库问答 >
问题:

Microsoft Bot中的相同线程正在复制欢迎消息

鲜于念
2023-03-14

我已将欢迎消息配置为在第一次启动bot时出现在MessagesController中。

    private Activity HandleSystemMessage(Activity message)
    {
        if (message.Type == ActivityTypes.ConversationUpdate)
        {
            // returning a msg here to the Post method in MessagesController.
        }
    }

当我调试时,似乎在开始时,两个线程正在运行bot,并且都在Post方法中执行,因此都在调用HandleSystemMessage。这对我来说是一个问题,因为有两个线程执行该方法,我的欢迎消息将在屏幕上打印两次。

我试图锁定打印msg并将其中一个线程Hibernate,但没有一个工作。我不知道为什么有两个线程开始执行。

它们有必要吗?他们都在执行相同的死刑。我能杀了他们中的一个吗?或者有没有不同的方法为机器人打印欢迎信息?

共有3个答案

萧英光
2023-03-14

或者,您可以尝试此代码

 else if (message.Type == ActivityTypes.ConversationUpdate)
                {

                    ConnectorClient connector = new ConnectorClient(new Uri(message.ServiceUrl));
                    var reply = message.CreateReply(BotMessages.WelcomeMessage);
                    connector.Conversations.SendToConversation(reply);
                    reply = message.CreateReply();
                    reply.AttachmentLayout = AttachmentLayoutTypes.Carousel;
                    reply.Attachments = HelpTextDialog.GetMessageCard();
                    connector.Conversations.SendToConversation(reply);



                }
齐驰
2023-03-14

您可能正在返回加入聊天的机器人和用户的消息。如果没有看到对话中的代码更新根对话框中的if-ther语句的一部分,很难判断。您可以使用以下代码发布一条消息

else if (message.Type == ActivityTypes.ConversationUpdate)
{
    // Handle conversation state changes, like members being added and removed
    // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info
    // Not available in all channels
    IConversationUpdateActivity iConversationUpdated = message as IConversationUpdateActivity;
    if (iConversationUpdated != null)
    {
        ConnectorClient connector = new ConnectorClient(new System.Uri(message.ServiceUrl));

        foreach (var member in iConversationUpdated.MembersAdded ?? System.Array.Empty<ChannelAccount>())
        {
            // if the bot is added, then
            if (member.Id == iConversationUpdated.Recipient.Id)
            {
                var reply = ((Activity) iConversationUpdated).CreateReply(
                    $"Hi! I'm Botty McBotface and this is a welcome message");
                await connector.Conversations.ReplyToActivityAsync(reply);
            }
        }
    }
}
司空俊悟
2023-03-14

在Web通道和机器人之间建立第一次对话时,会引发ConversationUpdate活动两次。一个由用户,另一个由信道,因此我们得到两次欢迎消息。我们需要确保我们为用户提出的活动发送了欢迎消息。

这段代码帮助我避免了这个问题。

 private async Task GreetUserAsync(ITurnContext turnContext, CancellationToken cancellationToken)
    {
        if (turnContext.Activity.Type == ActivityTypes.ConversationUpdate && 
            turnContext.Activity.MembersAdded[0].Id.Contains(turnContext.Activity.Recipient.Id))
            await turnContext.SendActivityAsync(MessageFactory.Text("Hi, how can I help you."));
    }
 类似资料:
  • 如何防止机器人连续两次发送相同的欢迎消息?我认为这与定义服务器消息意图有关。 client.on: 客户频道。隐藏物获取('channelID')。发送(“欢迎”);

  • 该站点的目标是成为 Jekyll 的全面指南。包括一些内容如:搭建和运行你的站点、创建以及管理内容、定制站点的展现和外观、在不同的环境中发布、以及参与到 Jekyll 将来的开发的一些建议。 Jekyll 究竟是什么? Jekyll 是一个简单的博客形态的静态站点生产机器。它有一个模版目录,其中包含原始文本格式的文档,通过一个转换器(如 Markdown)和我们的 Liquid 渲染器转化成一个完

  • 欢迎来到 Libra 开发者站点! Libra 的使命是建立一套简单的全球货币和金融基础设施,为数十亿人服务。 The world truly needs a reliable digital currency and infrastructure that together can deliver on the promise of “the internet of money.” Securi

  • 我需要我的discord机器人记住在不同的行会中向哪个频道发送问候。目前,我将频道名称作为前缀,并使用它来回忆发送到何处: 我如何设置一个命令,当机器人加入他们的公会时,所有者可以使用该命令,为每个公会设置一个唯一的欢迎通道(并且显然只向加入公会的人发送欢迎消息)。 哦,我如何设置一个命令,最终让人们改变他们公会的欢迎信息? 谢谢!:)

  • 所以我做了一个机器人,它会在一个频道里向新成员发送欢迎信息。我的代码应该工作,因为它没有在我的控制台上发送任何错误,但是我的机器人没有发送欢迎消息。 我尝试了很多东西: > 使嵌入对象成为对象(nope) 做了4个长的不同代码(都不工作) 我在用discord.js@v12 代码:

  • 我正在开发一个基于微软bot框架的多渠道bot(专注于web和电报)(https://docs.microsoft.com/en-us/azure/bot-service/?view=azure-bot-service-4.0) 我被用户收到的最初消息所困扰。我的机器人基于Microsoft发布的复杂机器人:https://github.com/Microsoft/BotFramework-Sam