Программа работает по-разному, когда я вхожу и когда я устанавливаю функцию в режиме отладки - PullRequest
4 голосов
/ 24 августа 2010

У меня есть функция GetAlertData(), которая возвращает Datatable.Я вызываю его как:

var dt = GetAlertData()

Поведение в режиме отладки:

Случай 1: Когда я все время выполняю F11 и перехожу в функцию GetAlertData, все работает хорошо, и я получаю правильноетаблица

Случай 2. Когда я выполняю F10 для этой функции и перехожу через нее, GetAlertData возвращает таблицу со всеми значениями, заполненными как ноль (неверно).(Все столбцы моей таблицы имеют тип данных с плавающей запятой)

В режиме выпуска поведение аналогично нажатию клавиши 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 ]

2 голосов
/ 24 августа 2010

Следует учитывать разницу во времени выполнения с использованием F11 и F10 (соответственно, вход и выход из методов).F11 входит в функцию, следовательно, удерживает вас в этой логике дольше, чем F10, которая переходит через код, позволяя выполнять его на полной скорости.

Суть в том, что у вас вполне может возникнуть проблема с синхронизацией / многопоточностью, которая устраняется, когда у приложения больше времени на обработку, вызванное тем, что вы потратите больше времени для перехода к коду с помощью F11.,Вот почему поведение релиза больше соответствует поведению F10, более быстрое выполнение.

Я предполагаю, что разбрызгивание чего-то вроде Thread.Sleep(250) вокруг проблемной области тоже поможет, но Я не рекомендую это ,Это действие последней инстанции, которое лучше всего использовать для проверки гипотезы о времени.Вам нужно выяснить, что работает одновременно, что может быть причиной этого.

1 голос
/ 24 августа 2010

Наиболее вероятная проблема здесь в том, что у вас есть свойство или .ToString, у которого есть побочные эффекты, которые оцениваются в окне autos / locals / watch при выполнении шага.В случае F11 это свойство помещается в одно из этих окон, оценивает, и его побочный эффект заставляет сценарий работать.В сценарии F10 этого не происходит, и сценарий не выполняется.

Вы можете легко проверить это, отключив неявную оценку функции.

  • Инструменты -> Параметры
  • Отладчик
  • Снимите флажок «Включить неявные свойства и вызовы»
  • Повторите ваш сценарий
1 голос
/ 24 августа 2010

Не видя исходного кода для GetAlertData, я могу только догадываться, что вы установили некоторые переменные наблюдения, которые обращаются к свойству или что-то с побочными эффектами, которые изменяют результат.Часы попадают в область действия только тогда, когда вы входите в метод GetAlertData.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...