1

我有一个带有“根”对话框的机器人,它使用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);

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

在传递给该方法之前,之前已编辑过argumentawait但我认为这不是问题,因为异常发生在context.Wait()似乎与IAwaitable.

4

1 回答 1

1

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

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

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

ChildDialogComplete(context, null);
于 2016-12-01T10:06:36.490 回答