C# 我无法在我的bot应用程序的异步方法中编写context.Forward

C# 我无法在我的bot应用程序的异步方法中编写context.Forward,c#,botframework,C#,Botframework,我使用C创建了一个bot应用程序 我想使用多个对话框设计我的机器人。在RootDialog.cs中,我编写了根据用户输入导航不同对话框的代码 我正在使用context.Forward导航到下一个对话框。但是在使用它的时候它显示了错误。在这里我附加了我的RootDialog.cs 有人能帮我解决这个问题吗 using System; using System.Threading.Tasks; using Microsoft.Bot.Builder.Dialogs; using Microsoft.

我使用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.Forwardnew PriceDialog、this.QuantityDialog、message、CancellationToken.None行中显示的堆栈顶部

context.Forward是这样的任务:

context.Forward(new NameDialog(), this.QuantityDialog, message, CancellationToken.None);
await DetailDialog(context, result);  
任务ForwardIDialog子项、ResumeAfter resume、T项、CancellationToken令牌; 第一个参数child表示要调用的子对话框,而不是任务。第二个表示子对话框完成后要恢复的方法,此方法可以在父对话框内部实现。item参数应该是要发送到子对话框的消息。最后一个是取消令牌。类型参数R表示子对话框预期的结果类型,同时T表示发送到子对话框的项的类型

因此,基本上,您应该能够完全根据其构造函数调用此转发任务。您的代码等待上下文。Forwardnew NameDialog、this.DetailDialog;这是不对的。您可以尝试这样修改它:

context.Forward(new NameDialog(), this.QuantityDialog, message, CancellationToken.None);
await DetailDialog(context, result);  
顺便说一下,如果您想在MessageReceivedAsync中调用task Detail对话框,可以直接这样调用:

context.Forward(new NameDialog(), this.QuantityDialog, message, CancellationToken.None);
await DetailDialog(context, result);  

有关更多信息,请参阅。

您面临的错误是什么?等待context.Forwardnew NameDialog,this.DetailDialog;context.Waitthis.MessageReceivedAsync;}这行似乎有误。错误是调用子对话框并将其添加到上下文中显示的堆栈顶部。Forwardnew PriceDialog,This.QuantityDialog,message,CancellationToken.None行。在NameDialog的StartSync和MessageReceivedAsync方法上放置一个断点,并尝试检查您作为第三个参数发送到上下文的IMessageActivity消息。Forward是否发送到子对话框,或者我没有尝试过上下文。Forwardnew NameDialog,this.QuantityDialog,message,取消令牌。无。但它仍然显示error.same error在同一行上下文中。Forwardnew NameDialog、this.QuantityDialog、message、CancellationToken.None。错误是调用子对话框并将其添加到堆栈顶部。@yaduska,您的NameDialog可能有问题,您可以参考此官方信息。~private async Task StartAsyncIDialogContext{context.WaitMessageReceivedAsync;}private async Task MessageReceivedAsyncIDialogContext,IAwaitable result{var output=wait result;ifoutput.Text.ToLower.contains设备公司名称{wait context.PostAsyncA,B,C;context.WaitMessageReceivedAsync;;~这是我的名字对话框。cs@yaduska,尝试更改代码专用异步任务QuantityDialogIDialogContext上下文中的IMessageActivity,IAwaitable result to object,并且还应修改此任务中的代码。