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

时间:2016-12-01 04:49:02

标签: c# bots botframework botbuilder

我有一个带有" root"使用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()

调试时,带有ChildDialogComplete的方法的最后一行会在模拟器中导致此异常:

  

异常: System.ArgumentNullException:值不能为null。参数名称:等待在Microsoft.Bot.Builder.Internals.Fibers.Fiber1.-PollAsync&gt; d__13.MoveNext()

     

---抛出异常的前一个位置的堆栈跟踪结束---

     

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

     

---抛出异常的前一个位置的堆栈跟踪结束---

     

......等等

ChildDialogComplete(context, argument); 运行时#14}自然地&#34;,当对话框退出时,不会发生此错误。它只发生在我尝试从根对话框的另一部分手动调用此方法时,如下所示:

context

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

await之前context.Wait()已被IAwaitable传递给该方法。但我认为这不是问题,因为异常发生在IWorkspace workspace = ResourcesPlugin.getWorkspace(); IResource resource = workspace.getRoot(); resource.deleteMarkers(null, true, 0); markers = resource.findMarkers(IMarker.MARKER, true, IResource.DEPTH_INFINITE); Robot robot = new Robot(); robot.keyPress(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_SHIFT); robot.keyPress(KeyEvent.VK_F2); robot.keyRelease(KeyEvent.VK_CONTROL); robot.keyRelease(KeyEvent.VK_SHIFT); robot.keyRelease(KeyEvent.VK_F2); //...command is executed, now running background process //...wait for all background process to finish for (IMarker m : markers) { System.out.println("Id: " + m.getId()); System.out.println("Message: " + m.getAttribute(IMarker.MESSAGE)); System.out.println("Line Number: " + m.getAttribute(IMarker.LINE_NUMBER)); } 行,似乎与ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { } }, new NullProgressMonitor()); 无关。

1 个答案:

答案 0 :(得分:1)

您无法将等待的值传递给期望IAwaitable<T>的方法。此外,如果是这种情况(在调用方法之前,另一个在方法内),你正在等待两次参数。

重构代码以提取ChildDialogComplete方法中的所有逻辑,这样您最终得到两个方法,一个接收IAwaitable<T>,另一个接收值。接收IAwaitable的人应该等待论证并调用新方法。

但是,您没有在该方法中使用该参数,因此如果是这种情况;您不需要重构,并且在删除方法的ChildDialogComplete调用后,您可以使用nullIAwaitable<T>参数调用await argument

ChildDialogComplete(context, null);