![](/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.