我正在使用Microsoft Bot框架编写一个机器人。它由使用await Conversation.SendAsync...
调用LuisDialog
的MessagesController
组成。
某些方案触发此消息的例外:
堆栈是空的
我在触发的机器人框架的源代码中找到了位置:
134 public static T Peek<T>(this IList<T> stack)
135 {
136 if (stack.Count == 0)
137 {
138 throw new InvalidOperationException("Stack is empty");
139 }
140
141 return stack[stack.Count - 1];
142 }
但是,我无法弄清楚它的究竟是如何触发的。当按线进行调试时,该代码似乎工作正常(有很多代码,并且会贯穿所有代码)。
只是让它在没有断点的情况下运行时,它会在此例外情况下崩溃。
我的await Conversation.SendAsync
被包裹在尝试/捕获中,这就是我捕获异常的方式。
我无法弄清楚代码的哪一部分完全导致异常。
您知道什么可能导致"堆栈是空"消息?
以后更新:
一段时间后,我开始在另一个代码中获取Stack is Empty
例外情况,并确保一切都是async
ED和await
ED:
public async Task StartAsync(IDialogContext context)
{
context.Wait(UserProfileStep1);
}
public async Task UserProfileStep1(IDialogContext context, IAwaitable<object> original)
{
string originalMessage = (string)await original; // <== the exception occurs here
事实证明,在这种特殊情况下,是因为我使用了context.Forward
并尝试将string
对象传递到其中,而仅支持IMessageActivity
对象。
对我来说,看起来您在某个地方缺少等待运营商。我以前曾遇到过这个例外(即使有同样的问题),当调用外部API并不等待完成时,所以当我调试时,我正在给我时间,但是实时的机器人比API更快。我需要查看您的代码以提供更多信息
context.Done<object>(null);
在startAsync的最后一个。