Как работать с библиотекой Task Parallel с DataReader

я часто заполняю считыватель данных данными и заполняю пользовательский интерфейс таким образом

using (SqlConnection conn = new SqlConnection("myConnString"))
using (SqlCommand comm = new SqlCommand("Select * from employee where salary<5000", conn))
{
    conn.Open();

    SqlDataReader reader = comm.ExecuteReader();

    if (reader.HasRows)
    {
        while (reader.Read())
        {
            // here i populate my employee class
        }
    }
    // here i update UI
}

я искал использование библиотеки Task Parallel с DataReader и нашел кусок кода. это выглядит красиво, но цель не очень ясна для меня. так вот код, который я получил.

public IEnumerable<MyDataClass> ReadData()
{
using (SqlConnection conn = new SqlConnection("myConnString"))
using (SqlCommand comm = new SqlCommand("myQuery", conn))
{
    conn.Open();

    SqlDataReader reader = comm.ExecuteReader();

    if (reader.HasRows)
    {
        while (reader.Read())
        {
            yield return new MyDataClass(... data from reader...);
        }
    }
}
}

звоню как

Parallel.ForEach(this.ReadData(), data =>
{
// Use the data here...
});

ИЛИ

this.ReadData().AsParallel().ForAll(data => 
{
// Use the data here...
});

как я могу получить данные из ForAll .

Может ли кто-нибудь помочь мне понять фрагмент кода, как он работает и как получить данные из ForAll и как я могу заполнить свой пользовательский интерфейс из ForAll .

другой вопрос: как узнать, какой класс является потокобезопасным или нет. что значит потокобезопасный. человек сказал, что datareader не является потокобезопасным. откуда он знает.

другой вопрос, когда нужно использовать параллельную библиотеку задач. пожалуйста, направляйте. спасибо

5
задан MoonKnight 14 August 2012 в 09:22
поделиться