代码之家  ›  专栏  ›  技术社区  ›  Michael Kniskern

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

  •  3
  • Michael Kniskern  · 技术社区  · 15 年前

    我有一个基本的 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 回复  |  直到 15 年前
        1
  •  4
  •   SLaks    15 年前

    我的猜测是,当您通过每一行给代码更多的时间时,代码的行为可能会有所不同。(大概是因为数据库)

    确保该方法没有引发任何异常(放置一个调用 Console.WriteLine MessageBox.Show 看看有什么事发生)。

    查看数据库日志,看看是否有什么有趣的地方。

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

        2
  •  2
  •   Shiraz Bhaiji    15 年前

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

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

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

        3
  •  1
  •   Michael Kniskern    15 年前

    它没有迭代 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);
    }
    
        4
  •  0
  •   Oliver    15 年前

    对我来说,这听起来像个例外。只是为了确定,您是否检查了调试中的所有内容-到的异常?