цикл foreach не перебирает все элементы списка - C # - PullRequest
3 голосов
/ 22 сентября 2009

У меня есть базовый цикл foreach, который вызывает статический метод, который устанавливает соединение с базой данных и вставляет некоторые данные. По какой-то причине он будет перебирать первый элемент в коллекции только при запуске приложения без отладки. Если я отлаживаю приложение и устанавливаю точку останова в цикле foreach, оно будет перебирать все элементы в коллекции.

Если я установлю точку останова и перешагну цикл foreach, он будет демонстрировать такое же поведение, как если бы я запускал приложение без отладки.

Кто-нибудь знает, что вызвало бы такой тип поведения?

Вот упрощенная версия исходного кода:

List<MyObject> objectlist = new List<MyObject>();

//some code to populate list

foreach(MyObject myobject in objectlist)
{
    string a = "a";
    string b = "b";

    MyLibrary.UpdateDatabase(a, b);
}

(я использую Visual Studio 2008 SP1)

Обновление

Процесс не выдает никаких исключений при отладке приложения или без него.

Ответы [ 4 ]

4 голосов
/ 22 сентября 2009

Полагаю, ваш код может вести себя по-разному, если вы даете ему больше времени, проходя через каждую строку. (Предположительно из-за базы данных)

Убедитесь, что метод не генерирует никаких исключений (поместите блок catch, который вызывает Console.WriteLine или MessageBox.Show и посмотрите, если что-нибудь случится).

Загляните в журналы базы данных и посмотрите, есть ли там что-нибудь интересное.

Также, пожалуйста, опубликуйте полный источник информации о методе.

2 голосов
/ 23 сентября 2009

Обычно, когда есть разница между кодом, работающим нормально, и кодом, запущенным в режиме отладки, это связано с контекстом безопасности.

Код, запущенный в процессе, будет выполняться в контексте безопасности этого процесса. Код, работающий в режиме отладки, будет выполняться в контексте безопасности пользователя, выполняющего отладку.

При нормальном выполнении кода вызов базы данных, вероятно, завершается неудачей из-за отсутствия прав. Тогда может показаться, что цикл запускается только один раз.

1 голос
/ 23 сентября 2009

Не было итерации цикла foreach, когда я не отлаживал приложение, поскольку объект myobject не использовался при вызове метода UpdateDatabase.

Мой исходный код должен выглядеть так:

List<MyObject> objectlist = new List<MyObject>();

//some code to populate list

foreach(MyObject myobject in objectlist)
{
    MyLibrary.UpdateDatabase(myobject.a, myobject.b);
}
0 голосов
/ 23 сентября 2009

Для меня это звучит как исключение. Просто чтобы быть уверенным, вы проверили все в Debug - исключения для On?

...