簡體   English   中英

我無法編寫context.Forward在我的bot應用程序的async方法中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM