C# MS Bot框架无法在无限循环中发送消息

C# MS Bot框架无法在无限循环中发送消息,c#,bots,botframework,botbuilder,C#,Bots,Botframework,Botbuilder,使用MS bot框架的我的bot在facebook和emulator频道上向用户发送消息时陷入无限循环 我的机器人有一个“根”IDialog,有点像一个菜单,它根据用户的选择调用一些其他的IDialog。子对话框的调用方式如下: ... else if (response.Text == MainOptions[2]) { await context.Forward(new InfoCounterDialog(), Chil

使用MS bot框架的我的bot在
facebook
emulator
频道上向用户发送消息时陷入无限循环

我的机器人有一个“根”
IDialog
,有点像一个菜单,它根据用户的选择调用一些其他的
IDialog
。子对话框的调用方式如下:

        ...
        else if (response.Text == MainOptions[2])
        {
            await context.Forward(new InfoCounterDialog(), ChildDialogComplete, 
                                  response, CancellationToken.None);
        }
        ...
  • 响应
    是用户发送的
    IMessageActivity
  • ChildDialogComplete
    是一种再次构建主菜单并以以下行结束的方法:

除了这一个非常短的对话框,所有的对话框都可以正常工作,它会导致一个无限循环-机器人会一次又一次地发送此消息,直到我停止web应用程序

namespace XXXX
{
[Serializable]
public class InfoCounterDialog : IDialog
{
    public async Task StartAsync(IDialogContext context)
    {
        var hourNow = DateTime.Now.Hour;
        var openNow = "";
        if (hourNow >= 7)
        {
            openNow = "It is open now and will close at midnight.";
        }
        else
        {
            openNow = "It is closed now and will open at 7:00";
        }
        var card = HeroCardUtils.CardWithImageAndMiscButtons(
            "Our information counter can help!",
            "It's located in Shop 081, Level 3 in Building 2. " + openNow,
            "http://www.[image URL here].jpg",
            new[] { "More Details" },
            new[] { ActionTypes.OpenUrl },
            new[] { "[webpage URL here]" }
            );
        await BotUtils.SendCardToChat(context, card);
        context.Done(this);
    }
}
}

如果您想知道
SendCardToChat
的作用:

    public async static Task SendCardToChat(IDialogContext context, HeroCard card)
    {
        var activity = context.MakeMessage();
        activity.Attachments = HeroCardUtils.CardToAttachments(card);
        await context.PostAsync(activity);
    }
重述:

  • 我正在使用
    context.Forward()
  • 该对话框应该向用户显示一条消息,并且在没有用户额外输入的情况下立即终止
  • 相反,它不断无限地发送“我们的信息计数器可以帮助”信息
我的最佳猜测是,子对话框以某种方式将用户的初始消息返回到对话中,从而一次又一次地触发相同的对话框。但是这种情况不应该发生,除了我创建的
HeroCard
之外,子
IDialog
不应该向对话发送任何内容


或者可能我看错了方向,Bot框架不支持执行某些操作并立即终止的
IDialog
s,而没有
context.Wait()

我发现关于context.Done(R值)的文档不多,但它在控制对话框流方面非常重要

我在猜测上下文。完成(这个)再次调用您的对话框?你试过了吗

context.Done(true);
我发现没有context.Done()方法(没有参数)来告诉对话框您的任务已经完成,这让我很沮丧

除此之外,我还发现他们使用


您是否尝试过将逻辑从StartSync移动到MessageReceivedAsync类型的方法?您正在执行context.Forward,因此不需要将逻辑放入StartAsync…@EzequielJadib,那么您的意思是
StartAsync()
应该什么都不做?如果它需要调用另一个方法,我假设您必须执行
context.Wait()
,这意味着要等待来自用户的更多输入,我希望避免并立即显示消息。您需要执行context.Wait(),但如果您执行context.Forward,您将不会等待用户输入,消息将通过。让我知道,我会把答案贴出来。我已经用其他方法解决了这个问题,虽然我不记得是怎么解决的。我在其他项目中成功地使用了上下文。我假设这就是我们要终止的IDialog对象;类似于此ms示例类中的finally语句
context.Done(true);
// within a HotelsDialog.cs
context.Done<object>(null);
// within RootDialog.cs
context.Call(new HotelsDialog(), this.ResumeAfterOptionDialog);