我有一个带有“根”对话框的机器人,它使用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()
在模拟器中导致此异常:
异常:System.ArgumentNullException:值不能为空。参数名称:等待Microsoft.Bot.Builder.Internals.Fibers.Fiber1.-PollAsync>d__13.MoveNext()
--- 从先前抛出异常的位置结束堆栈跟踪 ---
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 Microsoft.Bot.Builder.Internals.Fibers.Wait 2.Microsoft.Bot.Builder.Internals.Fibers.IAwaiter.GetResult() 在 Microsoft.Bot.Builder.Dialogs。 Chain.LoopDialog1.d__3.MoveNext()
--- 从先前抛出异常的位置结束堆栈跟踪 ---
...等等
ChildDialogComplete
当对话框退出时,“自然”运行时不会发生此错误。它仅在我尝试从根对话框的另一部分手动调用此方法时发生,如下所示:
ChildDialogComplete(context, argument);
其中context
和argument
是 IDialog ( IDialogContext context, IAwaitable<IMessageActivity> argument
) 中方法的两个标准参数。
在传递给该方法之前,之前已编辑过argument
。await
但我认为这不是问题,因为异常发生在context.Wait()
似乎与IAwaitable
.