Microsoft机器人框架中的"Stack is empty"



我正在使用Microsoft Bot框架编写一个机器人。它由使用await Conversation.SendAsync...调用LuisDialogMessagesController组成。

某些方案触发此消息的例外:

堆栈是空的

我在触发的机器人框架的源代码中找到了位置:

  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的最后一个。

最新更新