![](/img/trans.png)
[英]Differentiate whether IDialog was called using context.Call() or context.Forward() in Microsoft Bot Framework
[英]I couldn't write context.Forward within my async method in my bot application
我使用C#
创建一个bot应用程序。
我想使用多个对话框来设计我的机器人。 在RootDialog.cs
,我编写了代码来根据用户的输入导航不同的对话框。
我正在使用context.Forward
导航到下一个对话框。 但是使用它时显示错误。这里我附加了RootDialog.cs
。
谁能帮助我解决问题?
using System;
using System.Threading.Tasks;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;
using System.Threading;
namespace WebService.Dialogs
{
[Serializable]
public class RootDialog : IDialog<object>
{
public Task StartAsync(IDialogContext context)
{
context.Wait(MessageReceivedAsync);
return Task.CompletedTask;
}
public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
var message = await result;
if (message.Text.ToLower().Contains("name")) {
await context.Forward(new NameDialog(), this.DetailDialog);
context.Wait(this.MessageReceivedAsync);
}
// calculate something for us to return
// return our reply to the user
context.Wait(MessageReceivedAsync);
}
private async Task DetailDialog(IDialogContext context, IAwaitable<IMessageActivity> result)
{
var message = await result;
if (message.Text.ToLower().Contains("price"))
{
context.Forward(new PriceDialog(), this.QuantityDialog, message, CancellationToken.None);
context.Wait(this.MessageReceivedAsync);
}
}
private async Task QuantityDialog(IDialogContext context, IAwaitable<IMessageActivity> result) {
var mess = await result;
if (mess.Text.ToLower().Contains("Discount"))
{
await context.PostAsync("50% discount per each");
}
}
}
}
错误是调用一个子对话框并将其添加到“ context.Forward(new PriceDialog(),this.QuantityDialog,message,CancellationToken.None)”行中显示的堆栈的顶部。
context.Forward
是一个像这样的任务:
Task Forward<R, T>(IDialog<R> child, ResumeAfter<R> resume, T item, CancellationToken token);
第一个参数child
表示您要调用的子对话框 ,而不是任务。 第二个指示子对话框完成后恢复的方法,该方法可以在父对话框内部实现。 item
参数应该是您要发送到子对话框的消息。 最后一个是取消令牌。 类型参数R
代表子对话框期望的结果类型,同时T
代表发送给子对话框的项目的类型。
因此,基本上,您应该能够完全根据其构造函数调用此Forward
任务。 您的代码await context.Forward(new NameDialog(), this.DetailDialog);
是不正确的。 您可以尝试像这样修改它:
context.Forward(new NameDialog(), this.QuantityDialog, message, CancellationToken.None);
顺便说一句,如果要在MessageReceivedAsync
内部调用任务DetailDialog
,则可以像这样直接调用它:
await DetailDialog(context, result);
有关更多信息,您可以参考调用“新订单”对话框 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.