我有一个带有" 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
其中argument
和IDialogContext 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());
无关。
答案 0 :(得分:1)
您无法将等待的值传递给期望IAwaitable<T>
的方法。此外,如果是这种情况(在调用方法之前,另一个在方法内),你正在等待两次参数。
重构代码以提取ChildDialogComplete
方法中的所有逻辑,这样您最终得到两个方法,一个接收IAwaitable<T>
,另一个接收值。接收IAwaitable的人应该等待论证并调用新方法。
但是,您没有在该方法中使用该参数,因此如果是这种情况;您不需要重构,并且在删除方法的ChildDialogComplete
调用后,您可以使用null
为IAwaitable<T>
参数调用await argument
ChildDialogComplete(context, null);