有人可以向我解释为什么我的IEnumerable在GetMessages()上没有延迟加载。拿(5)?如果我调试foreach循环,它似乎延迟加载一个消息一次为前5个,将它们添加到listBox1,但然后在这5个之后它将继续填充列表的其余部分(这需要一分钟)在循环之后继续执行之前。
public void PopulateMessages()
{
foreach (string message in GetMessages().Take(5))
{
listBox1.Items.Add(message);
}
}
private static IEnumerable<string> GetMessages()
{
using (var conn = new SqlConnection(connectionString))
{
conn.Open();
// The Message table has thousands of rows
SqlDataReader reader = new SqlCommand("SELECT * FROM Message", conn).ExecuteReader();
while (reader.Read())
{
yield return reader.GetString(0);
}
}
}
感谢。
答案 0 :(得分:5)
延迟加载它们,但是:sql命令仍在运行。您可能尝试的一件事是using
:
using(var cmd = new SqlCommand("SELECT * FROM Message", conn))
using(var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
yield return reader.GetString(0);
}
}
然而,最佳解决方案是生成其中包含TOP 5
的TSQL,如果您想参数化,则可能是TOP (@count)
。
然后将尽快处理读者和命令。这样说:连接已经正确处理。