执行 context.Wait() 时 Bot Framework 错误:值不能为空。参数名称:等待

Bot Framework error when doing context.Wait(): Value cannot be null. Parameter name: wait

我有一个带有 "root" 对话框的机器人,运行 的子对话框根据用户的选择使用 context.Call()context.Forward(),如下所示:

context.Call(new QuestionsDialog(), ChildDialogComplete);

子对话框退出后,控制被传递给这个方法,ChildDialogComplete。它输出提示并等待用户的回复。

    public async Task ChildDialogComplete(IDialogContext context, IAwaitable<object> argument)
    {
        var unnecessaryTemp = await argument;
        var restartPrompt = context.MakeMessage();
        restartPrompt.Text = "Say \"hi\" again if I can help with anything else!";
        await context.PostAsync(restartPrompt);
        context.Wait(MainScreenSelectionReceived);
    }

调试时,最后一行带有context.Wait()的方法在模拟器中导致此异常:

Exception: System.ArgumentNullException: Value cannot be null. Parameter name: wait at Microsoft.Bot.Builder.Internals.Fibers.Fiber1.-PollAsync>d__13.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Microsoft.Bot.Builder.Internals.Fibers.Wait 2.Microsoft.Bot.Builder.Internals.Fibers.IAwaiter.GetResult() at Microsoft.Bot.Builder.Dialogs.Chain.LoopDialog1.d__3.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

...and so on

ChildDialogComplete 为 运行 "naturally" 时,当对话框退出时,不会发生此错误。它仅在我尝试从根对话框的另一部分手动调用此方法时发生,如下所示:

ChildDialogComplete(context, argument);

其中 contextargument 是 IDialog (IDialogContext context, IAwaitable<IMessageActivity> argument) 中方法的两个标准参数。

argument 在传递给方法之前已被 await 编辑。但我认为这不是问题,因为异常发生在似乎与 IAwaitable 无关的 context.Wait() 行。

您不能将等待的值传递给需要 IAwaitable<T> 的方法。此外,如果是这种情况,您将在参数中执行两次等待(一次在调用方法之前,另一次在方法内部)

重构您的代码以提取 ChildDialogComplete 方法中的所有逻辑,因此您最终得到两种方法,一种接收 IAwaitable<T> ,另一种仅接收值。接收 IAwaitable 的人应该等待参数并调用新方法。

但是,您没有在该方法中使用参数,所以如果是这样的话;您不需要重构,您可以在删除方法的 await argument 调用后调用 ChildDialogCompletenull 作为 IAwaitable<T> 参数

ChildDialogComplete(context, null);