我正在使用Microsoft Bot Framework编写机器人。它由使用MessagesController
调用LuisDialog
的{{1}}组成。
某些情况会触发此消息的异常:
堆栈为空
我在Bot Framework的源代码中找到了触发它的位置:
await Conversation.SendAsync...
然而,我无法弄清楚它是如何被触发的。在逐行调试时,代码似乎工作正常(有很多代码,并且它经历了所有代码)。
当让它在没有断点的情况下运行时,它会因此异常而崩溃。
我的 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 }
被包装到try / catch中,这就是我捕获异常的方法。
我无法弄清楚代码的哪一部分确切地导致异常。
你知道什么可能导致&#34;堆栈空了&#34;信息?
稍后更新:
一段时间后,我开始在另一段代码中获得await Conversation.SendAsync
个例外,我确保所有内容都是Stack is Empty
和async
ed:
await
事实证明,在这种特殊情况下,这是因为我使用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
个对象。
答案 0 :(得分:2)
对我来说,你似乎错过了某个地方的等候运营商。我之前遇到过这个异常(即使有同样的问题),在调用外部API时还没有等待它完成,所以当我调试时我给了时间,但是实时的机器人比API更快。我需要查看您的代码以提供更多信息
答案 1 :(得分:0)
context.Done<object>(null);
在StartAsync的最后一个中使用它。