代码之家  ›  专栏  ›  技术社区  ›  Hari Menon

在调试模式下,当我进入和设置一个函数时,程序运行的方式不同

  •  4
  • Hari Menon  · 技术社区  · 15 年前

    我有一个函数 GetAlertData()

    var dt = GetAlertData()
    

    调试模式下的行为:

    案例1:当我一直执行F11并进入GetAlertData函数时,一切都很好,我得到了正确的表

    案例2:当我对这个函数执行F10并遍历它时,GetAlertData返回一个表,其中所有值都填充为零(不正确)。(我的表的列都是float数据类型)

    在release模式下,行为和在debug模式下按F10相同,也就是说,我再次得到所有的零。

    有什么想法可以解释原因,或者我可以试着找出原因吗?谢谢。。

    编辑:我的GetAlertData函数是这样的。。

    internal static DataSet GetAlertData()
            {
                using (var sqlConnection = new SqlConnection(Constants.ConnectionString))
                {
                    const string sproc = @"[spo_GetAlertData]";
                    var cmd = new SqlCommand(sproc, sqlConnection) {CommandType = CommandType.StoredProcedure};
    
                    cmd.Parameters.Add("@TimeWindow", SqlDbType.Int);
                    cmd.Parameters["@TimeWindow"].Value =2
                    cmd.Parameters.Add("@ThresholdTime", SqlDbType.Int);
                    cmd.Parameters["@ThresholdTime"].Value = 2
                    var dsAnalysis = new DataSet();
                    var da = new SqlDataAdapter(cmd);
                    da.Fill(dsAnalysis);
                    if (dsAnalysis.Tables.Count > 0 && dsAnalysis.Tables[0].Rows.Count > 0)
                        return dsAnalysis;
                    return null;
                }
            }
    
    3 回复  |  直到 15 年前
        1
  •  2
  •   Paul Sasik    15 年前

    需要考虑的一点是使用F11和F10时执行时间的差异(分别是单步执行和单步执行方法)。F11步进一个函数,因此使您在逻辑线程中停留的时间比F10长,F10步进代码使其可以全速执行。

    关键是,当应用程序有更多的处理时间时,您很可能会遇到一个计时/线程问题,这个问题会得到缓解,这是由于您使用F11花了更多的时间来逐步完成和进入代码。这就是为什么发布更多的行为匹配F10的行为,更快的执行。

    我猜洒点什么 Thread.Sleep(250) 在问题区域周围也会有帮助但是 . 这是一个万不得已的行动,最好用来检验时机假设。您需要找出是什么并发运行可能导致这种情况。

        2
  •  1
  •   Richard Anthony Hein    15 年前

        3
  •  1
  •   JaredPar    15 年前

    这里最可能的问题是您有一个属性或.ToString,它有一些副作用,在您执行步骤时将在autos/locals/watch窗口中进行评估。在F11的例子中,这个属性放在其中一个窗口中,进行计算,它的副作用会导致场景工作。在F10场景中,它没有发生,场景失败。

    您可以通过禁用隐式函数求值来轻松测试这一点。

    • 工具->选项
    • 调试器
    • 取消选中“启用隐式属性和调用”复选框
    • 重新运行场景