C# MS Bot框架无法在无限循环中发送消息
使用MS bot框架的我的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
facebook
和emulator
频道上向用户发送消息时陷入无限循环
我的机器人有一个“根”IDialog
,有点像一个菜单,它根据用户的选择调用一些其他的IDialog
。子对话框的调用方式如下:
...
else if (response.Text == MainOptions[2])
{
await context.Forward(new InfoCounterDialog(), ChildDialogComplete,
response, CancellationToken.None);
}
...
是用户发送的响应
李>IMessageActivity
是一种再次构建主菜单并以以下行结束的方法:ChildDialogComplete
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);