2009-09-22 136 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?