执行 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);
其中 context
和 argument
是 IDialog (IDialogContext context, IAwaitable<IMessageActivity> argument
) 中方法的两个标准参数。
argument
在传递给方法之前已被 await
编辑。但我认为这不是问题,因为异常发生在似乎与 IAwaitable
无关的 context.Wait()
行。
您不能将等待的值传递给需要 IAwaitable<T>
的方法。此外,如果是这种情况,您将在参数中执行两次等待(一次在调用方法之前,另一次在方法内部)
重构您的代码以提取 ChildDialogComplete
方法中的所有逻辑,因此您最终得到两种方法,一种接收 IAwaitable<T>
,另一种仅接收值。接收 IAwaitable 的人应该等待参数并调用新方法。
但是,您没有在该方法中使用参数,所以如果是这样的话;您不需要重构,您可以在删除方法的 await argument
调用后调用 ChildDialogComplete
和 null
作为 IAwaitable<T>
参数
ChildDialogComplete(context, null);
我有一个带有 "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);
其中 context
和 argument
是 IDialog (IDialogContext context, IAwaitable<IMessageActivity> argument
) 中方法的两个标准参数。
argument
在传递给方法之前已被 await
编辑。但我认为这不是问题,因为异常发生在似乎与 IAwaitable
无关的 context.Wait()
行。
您不能将等待的值传递给需要 IAwaitable<T>
的方法。此外,如果是这种情况,您将在参数中执行两次等待(一次在调用方法之前,另一次在方法内部)
重构您的代码以提取 ChildDialogComplete
方法中的所有逻辑,因此您最终得到两种方法,一种接收 IAwaitable<T>
,另一种仅接收值。接收 IAwaitable 的人应该等待参数并调用新方法。
但是,您没有在该方法中使用参数,所以如果是这样的话;您不需要重构,您可以在删除方法的 await argument
调用后调用 ChildDialogComplete
和 null
作为 IAwaitable<T>
参数
ChildDialogComplete(context, null);