Цикл foreach не перебирает все элементы в списке - С#

У меня есть базовый цикл 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)

Обновить

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


person Michael Kniskern    schedule 22.09.2009    source источник
comment
Пожалуйста, опубликуйте небольшой полный пример, демонстрирующий проблему.   -  person Andrew Hare    schedule 22.09.2009
comment
Это может быть полностью отключено, но может быть вам нужна очистка, и в корзине отладки есть другая сборка сборок, чем в корзине приложения   -  person ryber    schedule 23.09.2009
comment
Вы используете несколько потоков?   -  person Aaron Daniels    schedule 23.09.2009
comment
убедитесь, что у вас нет try..catch вокруг foreach, который может потреблять исключения?   -  person BlackTigerX    schedule 23.09.2009
comment
@Aaron Daniels - я не использую несколько потоков   -  person Michael Kniskern    schedule 23.09.2009


Ответы (4)


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

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

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

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

person SLaks    schedule 22.09.2009
comment
Включение приостановки отладки для исключений отлично подходит для обнаружения таких вещей — msdn.microsoft. com/en-us/library/d14azbfh.aspx - person RichardOD; 23.09.2009
comment
Да, но он говорит, что в основном это происходит, когда работаешь не под отладчиком, так что этого недостаточно. - person SLaks; 23.09.2009
comment
Я имел в виду «Убедитесь, что метод не генерирует никаких исключений в качестве комментария» — я не опубликовал ответ... - person RichardOD; 23.09.2009

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

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

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

person Shiraz Bhaiji    schedule 22.09.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);
}
person Michael Kniskern    schedule 22.09.2009
comment
Пожалуйста, обновите свой исходный вопрос, когда у вас есть разъяснения (вот как работает SO;)) - person peterchen; 23.09.2009
comment
Разве этот ответ не был достаточным разъяснением? - person Michael Kniskern; 23.09.2009

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

person Oliver    schedule 23.09.2009