foreach循环不循环遍历列表中的所有项 - C#

时间:2009-09-22 19:56:45

标签: c# visual-studio-2008 debugging 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)

更新

无论是否调试应用程序,该过程都不会抛出任何异常。

4 个答案:

答案 0 :(得分:4)

我的猜测是,当您通过单步执行每行时,您的代码可能会有不同的行为。 (大概是因为数据库)

确保该方法没有抛出任何异常(放置一个调用Console.WriteLineMessageBox.Show的catch块,看看是否有任何异常。)

查看数据库日志,看看那里有什么有趣的东西。

另外,请发布方法的完整来源。

答案 1 :(得分:2)

通常,当正常运行的代码与调试中运行的代码之间存在差异时,它与安全上下文有关。

进程中运行的代码将在该进程的安全上下文中运行。在调试模式下运行的代码将在执行调试的用户的安全上下文中运行。

由于缺少权限,代码运行正常时,对数据库的调用可能会失败。然后看起来循环只运行一次。

答案 2 :(得分:1)

当我没有调试应用程序时,它没有迭代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);
}

答案 3 :(得分:0)

对我而言,这听起来像个例外。只是为了确定,你是否检查过Debug中的所有内容 - 例外为On?