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

时间:2010-08-24 03:54:35

标签: c# .net visual-studio visual-studio-2008 debugging

我有一个返回Datatable的函数GetAlertData()。我把它称为:

var dt = GetAlertData()

调试模式下的行为:

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

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

在发布模式下,行为与在调试模式下按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 个答案:

答案 0 :(得分:2)

要考虑的一件事是使用F11和F10执行时间的差异(分别踩到和踩过方法)。 F11进入一个函数,因此让你在逻辑线程中保持比F10更长的时间,它跨越代码允许它以全速执行。

关键在于,当应用程序因为您花费更多时间逐步完成并使用F11进入代码而导致处理时间更长时,您可以很好地解决时序/线程问题。这就是为什么发布更多行为与F10行为相匹配,执行速度更快。

我猜测在问题区周围散布Thread.Sleep(250)之类的内容也会有所帮助,但我不建议这样做。这是绝对最后的手段,最好用于测试时间假设。你需要找出可能导致这种情况并发运行的内容。

答案 1 :(得分:1)

如果没有看到GetAlertData的源代码,我只能猜测你已经设置了一些访问属性的监视变量或者具有改变结果的副作用的东西。当您进入GetAlertData方法时,手表才会进入范围。

答案 2 :(得分:1)

这里最可能的问题是你有一个属性或.ToString,当你步骤时,它会在autos / locals / watch窗口中评估副作用。在F11的情况下,这个属性放在其中一个窗口中,进行评估,并且它的副作用会导致场景工作。在F10场景中,它不会发生,并且场景失败。

您可以通过禁用隐式功能评估来轻松测试。

  • 工具 - >选项
  • 调试器
  • 取消选中“启用隐式属性并调用”复选框
  • 重新运行您的方案