有人可以向我解释为什么我的 IEnumerable 不是在 GetMessages().Take(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);
            }
        }
    }

谢谢。

最佳答案

然而,它是延迟加载它们: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)

这将尽快处理读取器和命令。说:连接已经正确处理。

关于c# - IEnumerable.Take() 上的延迟加载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11578367/

10-11 00:49