【发布时间】:2018-04-26 11:24:04
【问题描述】:
我开始开发一个简单的 Bot,从文档中的 Echo bot 演变而来。而且我很快就遇到了问题。
我的 RootDialog 上有这三种方法:
public async Task StartAsync(IDialogContext context)
{
await context.PostAsync("Olá! Eu sou um bot!");
await context.PostAsync("Qual é o teu nome?");
context.Wait(NameReceivedAsync);
}
private async Task NameReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
var activity = await result as Activity;
userName = activity.Text;
await context.PostAsync($"Olá {userName}. Podes dizer alguma coisa e eu vou repetir.");
context.Wait(MessageReceivedAsync);
}
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
var activity = await result as Activity;
// calculate something for us to return
int length = (activity.Text ?? string.Empty).Length;
// return our reply to the user
await context.PostAsync($"Tu disseste { activity.Text}, que tem {length} caracteres");
context.Wait(MessageReceivedAsync);
}
而我的 MessageController Post 方法是这样的:
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
return new HttpResponseMessage(System.Net.HttpStatusCode.Accepted);
}
这个想法是让机器人立即发送两条消息,等待用户输入用户名,发送另一条消息,然后转到 MessageReceivedAsync,在那里他将开始他的回声循环。问题是机器人没有等待输入,只在 MessageReceivedAsync 结束时停止,在那里他将开始回显。
我似乎无法理解为什么会发生这种情况,因为据我所见,context.Wait(...) 应该让 Bot 等待输入,而这并没有发生。我正在使用 Chrome 上的 Bot Framework Channel Emulator 对其进行测试,如果这有什么不同的话。
【问题讨论】:
-
context.Wait可以等待吗? -
@PaulSuart 方法参考是here。它不可等待,它需要一个异步委托
-
但是在本教程中,据我所见,他们没有做任何比我在 context.Wait 调用之后所做的更多的事情。 docs.microsoft.com/en-us/bot-framework/dotnet/…@PaulSuart
-
与我调用上下文时相同。在 MessageReceivedAsync 结束时等待,因为他在那里等待输入,然后再次发送消息。 @PanagiotisKanavos
标签: c# .net bots botframework