C# 如何在MicrosoftBot框架中不使用PromptDialog提示用户

C# 如何在MicrosoftBot框架中不使用PromptDialog提示用户,c#,botframework,azure-language-understanding,C#,Botframework,Azure Language Understanding,我有以下路易斯意图的实现- [LuisIntent("MyIntent")] public async Task MyIntent(IDialogContext context, IAwaitable<IMessageActivity> res, LuisResult result) { var message = await res; try { await context.PostAs

我有以下路易斯意图的实现-

    [LuisIntent("MyIntent")]
    public async Task MyIntent(IDialogContext context, IAwaitable<IMessageActivity> res, LuisResult result)
    {
        var message = await res;
        try
        {
            await context.PostAsync("I see that you have below options <br/> 1. Do first task <br/> 2. Do second task <br/> 3. Do third task ");
            PromptDialog.Text(context, taskdoer, "You can ask me like - <br/>Do task 2<br/>or simply enter 2");
        }
        catch (Exception e)
        {
            await context.PostAsync("Error is <br/> " + e.ToString());
            context.Wait(MessageReceived);
        }
    }
[LuisIntent(“我的意图”)]
公共异步任务MyIntent(IDialogContext上下文、IAwaitable res、LuisResult结果)
{
var消息=等待res;
尝试
{
wait context.PostAsync(“我发现您有以下选项
1.执行第一个任务
2.执行第二个任务
3.执行第三个任务”); Text(上下文,taskdoer,“您可以像-
执行任务2
或简单地输入2这样问我”); } 捕获(例外e) { wait context.PostAsync(“错误为
”+e.ToString()); Wait(MessageReceived); } }
以及taskdoer的定义-

    private async Task taskdoer(IDialogContext context, IAwaitable<string> result)
    {
        string strTaskNumber = await result;
                if (strTaskNumber == "2")
                {
                    await context.PostAsync("So, you have entered  " + strTaskNumber);
                    await context.PostAsync("This is Task 2");
                    context.Wait(MessageReceived);
                }
                if (strTaskNumber == "3")
                {
                    await context.PostAsync("So, you have entered  " + strTaskNumber);
                    await context.PostAsync("This is Task 3");
                    context.Wait(MessageReceived);
                }
    }
专用异步任务执行器(IDialogContext上下文,IAwaitable结果)
{
字符串strTaskNumber=等待结果;
如果(strTaskNumber==“2”)
{
wait context.PostAsync(“因此,您输入了”+strTaskNumber);
wait context.PostAsync(“这是任务2”);
Wait(MessageReceived);
}
如果(strTaskNumber==“3”)
{
wait context.PostAsync(“因此,您输入了”+strTaskNumber);
wait context.PostAsync(“这是任务3”);
Wait(MessageReceived);
}
}
我想实现的是,在不使用新方法taskdoer的情况下,我如何在MyIntent方法本身中实现taskdoer逻辑,而在taskdoer中使用用户提示输入?
是否有任何方法可以在不使用Microsoft bot中的PromptDialog的情况下提示用户?

您无法以您所看到的方式实现它。如果您需要用户的输入,则必须始终使用新方法对响应进行操作

您可以尝试使用匿名方法,尽管您仍然拥有一个方法,并通过一些技巧将其置于相同的范围内。这可能行不通

PromptDialog.Text(context, async (IDialogContext ctx, IAwaitable<string> resume) =>
{
    // your magic here
}, "text");
PromptDialog.Text(上下文,异步(IDialogContext ctx,IAwaitable resume)=>
{
//你的魔法在这里
}“文本”);
如果您不想在intent方法中使用
提示符
,另一种选择是:

  • 不要使用
    提示符
    ,而是执行
    上下文.PostAsync
    向用户显示问题
  • 使用
    上下文。等待
    等待用户输入。您可以等待一个新方法(应该有两个参数,
    IDialogContext
    IAwaitable
    ),或者您可以使用从
    LUIS
    接收的消息,覆盖它并在那里添加一些逻辑,以知道消息什么时候不应该发出
    LUIS
    ,并且您应该执行
    Doer
    逻辑。我建议你有一个单独的方法

  • 我很好奇为什么您不想使用
    提示符

    您不能按照您所看到的方式实现它。如果您需要用户的输入,则必须始终使用新方法对响应进行操作

    您可以尝试使用匿名方法,尽管您仍然拥有一个方法,并通过一些技巧将其置于相同的范围内。这可能行不通

    PromptDialog.Text(context, async (IDialogContext ctx, IAwaitable<string> resume) =>
    {
        // your magic here
    }, "text");
    
    PromptDialog.Text(上下文,异步(IDialogContext ctx,IAwaitable resume)=>
    {
    //你的魔法在这里
    }“文本”);
    
    如果您不想在intent方法中使用
    提示符
    ,另一种选择是:

  • 不要使用
    提示符
    ,而是执行
    上下文.PostAsync
    向用户显示问题
  • 使用
    上下文。等待
    等待用户输入。您可以等待一个新方法(应该有两个参数,
    IDialogContext
    IAwaitable
    ),或者您可以使用从
    LUIS
    接收的消息,覆盖它并在那里添加一些逻辑,以知道消息什么时候不应该发出
    LUIS
    ,并且您应该执行
    Doer
    逻辑。我建议你有一个单独的方法
  • 我很好奇为什么您不想使用
    提示符