Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Bot Framework PromptDialog不请求第一次提示_C#_Botframework - Fatal编程技术网

C# Bot Framework PromptDialog不请求第一次提示

C# Bot Framework PromptDialog不请求第一次提示,c#,botframework,C#,Botframework,我正在学习MicrosoftBot框架,所以我正在学习教程并编写一些示例对话框。我正试着写一个计算器机器人。(bot请求一个整数、一个运算和另一个整数) 但是,我无法让机器人实际询问用户的输入。如果用户在启动对话框后键入任何内容,则响应为$invalid need:expected Call,have Poll。我看到一些问题说不能在同一个函数调用中使用提示和上下文。Wait,但我没有找到任何说明如何处理此问题的内容 public class CalculatorDialog : IDialog

我正在学习MicrosoftBot框架,所以我正在学习教程并编写一些示例对话框。我正试着写一个计算器机器人。(bot请求一个整数、一个运算和另一个整数)

但是,我无法让机器人实际询问用户的输入。如果用户在启动对话框后键入任何内容,则响应为
$invalid need:expected Call,have Poll
。我看到一些问题说不能在同一个函数调用中使用提示和
上下文。Wait
,但我没有找到任何说明如何处理此问题的内容

public class CalculatorDialog : IDialog<object>
{
    protected readonly String[] operators = { "+", "-", "*", "/" };
    private long Left { get; set; }
    private long Right {get; set; }
    private String Operator { get; set; }

    public async Task StartAsync(IDialogContext context)
    {
        context.Wait(Calculate);
    }

    private async Task Calculate(IDialogContext context, 
                                 IAwaitable<IMessageActivity> result)
    {
        await result;

        PromptDialog.Number(
            context,
            async (ctx, lhs) => { Left = await lhs; },
            "Left hand side"
        );

        PromptDialog.Choice<string>(
            context,
            async (ctx, op) => { Operator = await op; },
            new PromptOptions<string>("Operator:", options: operators)
        );

        PromptDialog.Number(
            context,
            async (ctx, rhs) => { Right = await rhs; },
            "Right hand side"
        );

        long res;
        switch (Operator) { /* res = Left Operator Right */}

        await context.PostAsync($"The result is: ${res}");
    }
}

其中,
ResumeAferSubDialog
继续主循环。

在代码中,我发现您连续调用
PromptDialog.Number
PromptDialog.Choice
方法,您可以修改代码以执行/调用上一个Resume处理程序中的下一个PromptDialog,以下代码片段供您参考

private async Task Calculate(IDialogContext context, IAwaitable<IMessageActivity> result)
{
    await result;

    PromptDialog.Number(
        context,
        LeftReceivedAsync,
        "Left hand side"
    );
}

private async Task LeftReceivedAsync(IDialogContext context, IAwaitable<long> lhs)
{
    Left = await lhs;

    PromptDialog.Choice<string>(
        context,
        OperatorReceivedAsync,
        new PromptOptions<string>("Operator:", options: operators)
    );
}

private async Task OperatorReceivedAsync(IDialogContext context, IAwaitable<string> op)
{
    Operator = await op;

    PromptDialog.Number(
        context,
        RightReceivedAsync,
        "Right hand side"
    );
}

private async Task RightReceivedAsync(IDialogContext context, IAwaitable<long> rhs)
{
    Right = await rhs;

    long res;

    //switch (Operator) { /* res = Left Operator Right */}

    await context.PostAsync($"The result is: ${res}");

}
测试pic2:


好的,那么每个方法只能有一个
PromptDialog
调用吗?
每个方法只能有一个PromptDialog调用吗?
Hi@EdwardMinnix,您的意思是创建PromptDialog的实例,然后通过该实例对象调用.Number()和.Choice()方法吗?如果检查PromptDialog类的定义,可以发现.Number()和.Choice()方法被定义为静态的,无需创建类的实例即可调用。我的意思是我想知道代码中的一个错误是否以链式方式使用了.Number()和.Choice()(都在同一个方法中)而不是像上面那样有一个方法链。据我所知,不建议在同一个方法中逐个调用PromptDialog.Number()和PromptDialog.Choice()方法,正如您在问题中提到的,这可能会导致异常。
private async Task Calculate(IDialogContext context, IAwaitable<IMessageActivity> result)
{
    await result;

    PromptDialog.Number(
        context,
        LeftReceivedAsync,
        "Left hand side"
    );
}

private async Task LeftReceivedAsync(IDialogContext context, IAwaitable<long> lhs)
{
    Left = await lhs;

    PromptDialog.Choice<string>(
        context,
        OperatorReceivedAsync,
        new PromptOptions<string>("Operator:", options: operators)
    );
}

private async Task OperatorReceivedAsync(IDialogContext context, IAwaitable<string> op)
{
    Operator = await op;

    PromptDialog.Number(
        context,
        RightReceivedAsync,
        "Right hand side"
    );
}

private async Task RightReceivedAsync(IDialogContext context, IAwaitable<long> rhs)
{
    Right = await rhs;

    long res;

    //switch (Operator) { /* res = Left Operator Right */}

    await context.PostAsync($"The result is: ${res}");

}
protected readonly String[] operators = { "add (+)", "subtract (-)", "multiply (*)", "divide (/)" };