2009-09-22 133 views
3

我有一个基本的foreach循环,该循环调用一个静态方法,它可以连接到数据库并插入一些数据。出于某种原因,当我运行应用程序而不进行调试时,它只会迭代集合中的第一项。如果我调试应用程序并在foreach循环中设置断点,它将循环访问集合中的所有项目。foreach循环不遍历列表中的所有项目 - C#

如果我设置了一个断点并跨越了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)

更新

的过程中不会引发任何异常带或无需调试应用程序。

+14

请发布一个小而完整的例子来演示这个问题。 – 2009-09-22 19:57:36

+4

这可能完全关闭,但是它可能是你需要一个干净的,在调试箱中有比在应用程序bin中有不同的生成版本 – ryber 2009-09-22 20:03:30

+1

你使用多线程吗? – 2009-09-22 20:06:05

回答

1

由于在UpdateDatabase方法调用中没有使用myobject对象,所以当我没有调试应用程序时,它并没有迭代通过foreach循环。

我的源代码应该是这样的:

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

//some code to populate list 

foreach(MyObject myobject in objectlist) 
{ 
    MyLibrary.UpdateDatabase(myobject.a, myobject.b); 
} 
+0

当你有澄清请更新您原来的问题(这是怎么回事工程;) ) – peterchen 2009-09-23 06:55:38

+0

这个答案不够澄清吗? – 2009-09-23 16:15:51

4

我的猜测是你的代码可能会有不同的表现,当你通过逐行浏览来给它更多的时间。 (可能是因为数据库)

确保该方法没有抛出任何异常(将一个catch块调用Console.WriteLineMessageBox.Show并查看是否有任何事情发生)。

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

此外,请发布该方法的完整源代码。

+2

的例外,打开调试中断为察觉这几样东西 - http://msdn.microsoft.com/en-us/library/d14azbfh.aspx – RichardOD 2009-09-22 20:04:57

+0

是的是伟大的,但他说它主要发生在没有在调试器下运行的时候,所以这还不够。 – SLaks 2009-09-22 20:08:46

+0

我指的是“确保方法不抛出任何异常”作为comment-我还没有张贴解答... – RichardOD 2009-09-22 20:30:25

2

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

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

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

0

对我来说,这听起来像一个例外。可以肯定的是,您是否在Debug中检查了所有内容 - Exceptions On?