Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在调试模式下,当我进入和设置函数时,程序运行方式不同_C#_.net_Visual Studio_Visual Studio 2008_Debugging - Fatal编程技术网

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

C# 在调试模式下,当我进入和设置函数时,程序运行方式不同,c#,.net,visual-studio,visual-studio-2008,debugging,C#,.net,Visual Studio,Visual Studio 2008,Debugging,我有一个函数GetAlertData(),它返回一个数据表。我将其称为: var dt = GetAlertData() 调试模式下的行为: 案例1:当我一直执行F11并进入GetAlertData函数时,一切都很好,我得到了正确的表 案例2:当我对这个函数执行F10并跳过它时,GetAlertData返回一个表,其中所有值都填充为零(不正确)。(我的表中的列都是float数据类型) 在发布模式下,行为与在调试模式下按F10相同,即再次得到全零 有没有关于原因的想法,或者我能找到什么原因?谢谢

我有一个函数
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;
            }
        }

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

< P>一个要考虑的是使用F11和F10的执行时间上的差异(分别进入和跨过方法)。F11步进一个函数,因此使您在该逻辑线程中的时间比F10长,F10步进代码使其以全速执行

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


我猜在问题区域周围喷洒类似于
Thread.Sleep(250)
的东西也会有帮助,但是我不建议这样做。这是一个绝对的最后手段,最好用来检验时机假设。您需要找出可能导致此问题的原因是什么。

这里最可能的问题是您有一个属性或.ToString,它具有副作用,当您执行此步骤时,会在自动/本地/监视窗口中进行评估。在F11案例中,这个属性被放在其中一个窗口中,进行计算,它的副作用导致场景工作。在F10场景中,这不会发生,场景失败

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

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

您如何看待这一点?在可视化工具中?或者调试器本地人?为什么决定将该方法设置为静态?这种类型的代码通常实现为基于实例的(非静态)。简单地将其作为实例方法可能会解决潜在的线程问题。此外,还考虑通过锁(_synchObj)进行一些同步以保护它。您是否只在GetAlertData中看到案例1中的数据,还是在它返回给调用方之后看到数据?我可以在案例1ah中看到所有数据。。。终于明白了。一个简单的线程。睡眠没有做到这一点。。。很难找到原因-这是两个线程从同一个DB修改的糟糕交互。。你的答案最接近:)