我有以下代碼。查詢需要大約30秒才能執行。我發現每次調用頂層using
塊時for each
都會嘗試枚舉迭代器。對枚舉器中的每個調用MoveNext
執行哪個查詢。爲什麼在包含yield return的函數中重複使用(){}塊?
那麼爲什麼懶惰的評估一次又一次地重塑using
。我知道周圍的工作,但我需要了解這個目的。
private IEnumerable<FriendProfile> GetProfiles() {
var query = @"
SELECT VirtualNumber, City, Gender, Nick, Age
FROM Profiles
WHERE Not VirtualNumber In (SELECT VirtualNumber FROM Messages)
ORDER BY Id DESC;";
using (var con = GetConnection()) {
using (var cmd = dbconnection.CreateCommand()) {
cmd.CommandText = query;
var reader = cmd.ExecuteReader();
while (reader.Read()) {
var fp = new FriendProfile();
fp.VirtualNumber = reader.GetString(0);
fp.City = reader.GetString(1);
fp.Gender = reader.GetString(2);
fp.Nick = reader.GetString(3);
fp.Age = reader.GetInt16(4).ToString();
yield return fp;
}
}
}
}
foreach(var fp in GetProfiles()){
.... //foreach item using(){} in GetProfile() is reinitializes. All usings blocks
}
你對我是一個錯誤。 `IEnumerable a = Test();`我在多個循環中使用了多個時間。爲每個調用`a.GetEnumerator()`迭代,這就是爲什麼以前的枚舉器是垃圾收集或處置。我應該保存`var b = Test()。GetEnumerator()`並多次使用它。 –
affan
2010-11-27 21:24:04