3

IEnumerableがGetMessages()。Take(5)に遅延ロードされない理由を誰かが説明してもらえますか?foreachループをデバッグすると、最初の5つのメッセージを一度に1つずつ遅延ロードして、それらをlistBox1に追加しているように見えますが、その後5つは、リストの残りの部分にデータを入力し続けます(1分ほどかかります)。ループの後で実行を続行する前。

    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);
            }
        }
    }

ありがとう。

4

1 に答える 1

5

ただし、それらをロードするのは遅延です。sqlコマンドはまだ実行中です。あなたが試みるかもしれない1つのことはもう少しですusing

using(var cmd = new SqlCommand("SELECT * FROM Message", conn))
using(var reader = cmd.ExecuteReader())
{
    while (reader.Read())
    {
        yield return reader.GetString(0);
    }
}

ただし、最適な解決策は、を含むTSQLを生成することです。パラメーター化TOP 5するTOP (@count)場合は、を生成することもできます。

これにより、リーダーとコマンドができるだけ早く破棄されます。つまり、接続はすでに正しく破棄されています。

于 2012-07-20T11:32:58.763 に答える