简单对话框中的 Stackoverflow 异常

2024-03-15

您好,我在这两个对话框中收到 Stackoverflow 异常。Dialog A正在从主对话框类中调用。对话框A有一个选择去Dialog A child and Dialog A child有选择回去Dialog A。但它遇到了 Stackoverflow 异常。当我从另一个中删除一个时:示例删除Dialog A child from Dialog A或删除Dialog A from Dialog A child,异常错误消失。简而言之,当两个对话框可以互相调用时,它会抛出 Stackoverflow 异常。

我知道我可以EndDialogAsync在这个特定场景中返回Dialog A但我真正的对话流程并不是这样在一起的 。如何解决这个问题?

对话框A代码:

 public class DialogA : ComponentDialog
{
    private const string InitialId = "dialogA";
    private const string ChoicePrompt = "choicePrompt";
    private const string DialogAchildId = "dialogA_childId";

    public DialogA(string dialogId)
        : base(dialogId)
    {
        InitialDialogId = InitialId;

        WaterfallStep[] waterfallSteps = new WaterfallStep[]
         {
            FirstStepAsync,
            SecondStepAsync,
            ThirdStepAsync,
         };
        AddDialog(new WaterfallDialog(InitialId, waterfallSteps));
        AddDialog(new ChoicePrompt(ChoicePrompt));
        AddDialog(new DialogA_child(DialogAchildId));

    }

    private static async Task<DialogTurnResult> FirstStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken = default(CancellationToken))
    {
        return await stepContext.PromptAsync(
            ChoicePrompt,
            new PromptOptions
            {
                Prompt = MessageFactory.Text($"Here are your choices:"),
                Choices = new List<Choice>{new Choice { Value = "Open Dialog A_Child", }, new Choice { Value = "Open Dialog B_Child" }, },
                RetryPrompt = MessageFactory.Text($"Please choose one of the options."),
            });
    }

    private static async Task<DialogTurnResult> SecondStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken = default(CancellationToken))
    {
        var response = (stepContext.Result as FoundChoice)?.Value.ToLower();

        if (response == "open dialog a_child")
        {
            return await stepContext.BeginDialogAsync(DialogAchildId, cancellationToken: cancellationToken);
        }

        return await stepContext.NextAsync();
    }

    private static async Task<DialogTurnResult> ThirdStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken = default(CancellationToken))
    {
        return await stepContext.EndDialogAsync();
    }

对话框A子代码:

 public class DialogA_child : ComponentDialog
{
  private const string InitialId = "dialogAchild";
    private const string ChoicePrompt = "choicePrompt";
    private const string DialogAId = "dialogAId";

    public DialogA_child(string dialogId)
        : base(dialogId)
    {
        InitialDialogId = InitialId;

        WaterfallStep[] waterfallSteps = new WaterfallStep[]
         {
            FirstStepAsync,
            SecondStepAsync,
         };
        AddDialog(new WaterfallDialog(InitialId, waterfallSteps));
        AddDialog(new DialogA(DialogAId));

    }

    private static async Task<DialogTurnResult> FirstStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken = default(CancellationToken))
    {
        return await stepContext.PromptAsync(
       ChoicePrompt,
       new PromptOptions
       {
           Prompt = MessageFactory.Text($"Here are your choices:"),
           Choices = new List<Choice> {new Choice { Value = "Open Dialog A" }, new Choice { Value = "Open Dialog B" }, },
           RetryPrompt = MessageFactory.Text($"Please choose one of the options."),
       });
    }

    private static async Task<DialogTurnResult> SecondStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken = default(CancellationToken))
    {
        var response = (stepContext.Result as FoundChoice)?.Value.ToLower();

        if (response == "open dialog a")
        {
            return await stepContext.BeginDialogAsync(DialogAId, cancellationToken: cancellationToken);
        }

        return await stepContext.NextAsync();
    }

调用对话框A的主要代码:

   public class MainDialog : ComponentDialog
{
    private const string InitialId = "mainDialog";
    private const string ChoicePrompt = "choicePrompt";
    private const string DialogAId = "dialogAId";

    public MainDialog(string dialogId)
        : base(dialogId)
    {
        InitialDialogId = InitialId;

        WaterfallStep[] waterfallSteps = new WaterfallStep[]
         {
            FirstStepAsync,
            SecondStepAsync,
            ThirdStepAsync,
         };
        AddDialog(new WaterfallDialog(InitialId, waterfallSteps));
        AddDialog(new ChoicePrompt(ChoicePrompt));
        AddDialog(new DialogA(DialogAId));
    }

    private static async Task<DialogTurnResult> FirstStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken = default(CancellationToken))
    {
        return await stepContext.PromptAsync(
            ChoicePrompt,
            new PromptOptions
            {
                Prompt = MessageFactory.Text($"Here are your choices:"),
                Choices = new List<Choice>{ new Choice { Value = "Open Dialog A" }, new Choice { Value = "Open Dialog B" }, },
                RetryPrompt = MessageFactory.Text($"Please choose one of the options."),
            });
    }

    private static async Task<DialogTurnResult> SecondStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken = default(CancellationToken))
    {
        var response = (stepContext.Result as FoundChoice)?.Value.ToLower();

        if (response == "open dialog a")
        {
            return await stepContext.BeginDialogAsync(DialogAId, cancellationToken: cancellationToken);
        }

        if (response == "open dialog b")
        {
        }

        return await stepContext.NextAsync();
    }

    private static async Task<DialogTurnResult> ThirdStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken = default(CancellationToken))
    {

        return await stepContext.EndDialogAsync();
    }

In 视觉工作室你可以检查你的call stack你就会知道你的具体问题出在哪里StackOverflowException.

如果 DialogA 是DialogA_child然后在你的DialogA_child的构造函数和您的基类构造函数将递归地调用自己。

所以你的调用堆栈应该如下所示:

  1. DialogA构造函数添加新的DialogA_child
  2. DialogA_child调用基地(所以DialogA constructor)
  3. DialogA构造函数添加新的DialogA_child
  4. DialogA_child调用基地(所以DialogA constructor)
  5. ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单对话框中的 Stackoverflow 异常 的相关文章

  • 是否有与 posix_memalign 对应的 C++ 版本?

    当我打电话时posix memalign http man7 org linux man pages man3 posix memalign 3 html为类型的对象分配对齐的内存Foo在我的 C 代码中 我需要做一个reinterpret
  • 静态只读字符串数组

    我在我的 Web 应用程序中使用静态只读字符串数组 基本上数组有错误代码 我将所有类似的错误代码保存在一个数组中并检查该数组 而不是检查不同常量字符串中的每个错误代码 like public static readonly string m
  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • 系统空闲检测

    我想检测系统是否空闲 即 用户没有使用系统 我希望它像 Windows Live Messenger 一样 当我离开计算机大约 3 分钟时 它会自动更改为离开 我想在代码中设置这个时间 我正在使用 Visual Studio 2008 和
  • 如何使用 Git 分支支持覆盖 TeamCity 7.1 中的 分支名称?

    我有一个 CI 构建 从 Github 拉取功能分支 并使用基于项目 分支和构建号的文件夹命名约定将它们构建 打包到本地文件夹中 对于命名分支 feature1 feature2 这非常有效 问题是 当我向 master 提交时 TeamC
  • Safari (iPad) 中的弹性项目重叠

    我无法通过简单的任务解决问题 容器宽度为 100 但有 padding right 和 box sizing 溢出 容器是弹性行 容器有两个具有动态内容的子容器 第一个孩子有内容的大小 第二个孩子占据剩余的宽度 预期结果 iPad 结果 例
  • 我如何调试 Hadoop MapReduce [重复]

    这个问题在这里已经有答案了 我正在尝试构建一个地图缩减作业 它运行完成 但最后呈现奇怪的数据 当我尝试使用 system out println debug data 调试它时 它没有显示在屏幕上 使用 java API 生成外部日志文件
  • 标准容器的复杂性保证有哪些?

    显然 标准容器提供了某种形式的保证 有哪些类型的保证以及不同类型集装箱之间的具体区别是什么 工作自SGI页面 http www sgi com tech stl about STL http en wikipedia org wiki St
  • Android 在应用程序被杀死时重新安排 Alarmmanager 警报

    我开发了一个应用程序来安排多个本地通知以提醒用户做某事 今年的每个月都应该发出通知 这些本地通知是使用 AlarmManager 安排的 在 BroadcastReceiver 的 OnRetrieve 中创建并引发通知 它一切正常 直到应
  • 避免 Angular CLI 中的相对路径

    我正在使用最新的 Angular CLI 并且创建了一个自定义组件文件夹 它是所有组件的集合 例如 TextInputComponent has a TextInputConfiguration放置在里面的类src components c
  • 在 Windows 中对二进制文件进行逆向工程的最佳实践是什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 就我而言 它写成c c 如果这很重要的话 IDA 表现出色 IDA反汇编器 http www hex rays com idapro
  • 加密柱状转置密码

    我试图弄清楚如何在给定明文大写字符串和任意长度的数字密钥的情况下加密 Python 中的柱状转置密码 例如 如果键是 3124 并且字符串是 IHAVETWOCATS 它将像这样组织字符串 3124 IHAV ETWO CATS 然后先返回
  • 使用 aspnet_regiis 加密 web.config 部分会删除 system.webServer 元素

    我使用以下命令来加密 web config 中的自定义部分 C Windows Microsoft NET Framework64 v4 0 30319 aspnet regiis exe aspnet regiis exe pe Cust
  • 如何在shell脚本中操作数组

    我希望我的脚本定义一个空数组 如果预定义条件成立 则应添加数组值 为此我所做的是 declare a FILES file count 0 if file ext SUPPORTED FILE TYPE then echo file ext
  • 在控制台应用程序中获取 IP 地址

    我希望通过控制台应用程序找出我的 IP 地址 我习惯使用网络应用程序Request ServerVariables收集和 或Request UserHostAddress 如何在控制台应用程序中完成此操作 最简单的方法如下 using Sy
  • EF在运行时从Type获取记录列表

    目的 我需要循环所有记录 例如 var records db Set
  • 如何在 Rails 的功能测试中启用页面缓存?

    是否可以打开页面缓存进行功能测试 以下内容不起作用 class ArticlesControllerTest lt ActionController TestCase def setup ActionController Base publ
  • 是否可以获取对象的不可枚举继承属性名称?

    在 JavaScript 中 我们有几种获取对象属性的方法 具体取决于我们想要获取的内容 1 Object keys 它返回对象的所有自己的可枚举属性 即 ECMA5 方法 2 a for in循环 返回对象的所有可枚举属性 无论它们是自己
  • 你如何理解一大块代码?

    我是一名刚刚开始工作的应届大学毕业生 在我的起步阶段 我需要学习很多产品代码 有一些设计文档 但没有多大帮助 您能否提供一些通用技术来浏览和理解庞大的产品代码 特别是 C 运行它doxygen http www doxygen nl 这将生
  • StreamBuilder 子更新在导航后不呈现

    我正在使用扑动StreamBuilder决定向用户显示哪个 根 页面 现在基本上有2种可能性 LoginPage or HomePage 我的应用程序的主要构建方法如下所示 Widget build BuildContext context
  • 在没有 root 权限的 Linux 上安装 gcc

    我可以使用公共图书馆中的计算机 并且我想尝试一些 C 以及其他代码 问题是没有安装 g 并且我无法使用包安装它 因为我没有 root 访问权限 是否有一种 智能 方法可以在主文件夹中创建完整的编程环境 我安装了gcc 我可以编译C代码 另外
  • 错误:yarn start - 错误命令“start”未找到

    我正在尝试学习 React 并且我正在使用一个私人存储库来开始它 I run yarn start在存储库的目录中 但我收到错误消息 yarn run v1 13 0 error Command start not found info V
  • 简单对话框中的 Stackoverflow 异常

    您好 我在这两个对话框中收到 Stackoverflow 异常 Dialog A正在从主对话框类中调用 对话框A有一个选择去Dialog A child and Dialog A child有选择回去Dialog A 但它遇到了 Stack