我喜欢第三方物流中Parallel.For和Parallel.ForEach扩展方法的简单性。我想知道是否有一种方法可以利用类似的东西,甚至是稍微更高级的任务。
下面是SqlDataReader的一个典型用法,我想知道这是否可能,如果可能,如何用第三方公共语言中的内容替换下面的while循环。因为阅读器不能提供固定的迭代次数,所以For扩展方法是不可能的,这就留下了处理我要收集的任务。我希望有人已经解决了这个问题,并和ADO.net一起解决了一些该做什么和不该做什么。
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())
{
// Do something with Reader
}
}
}
发布于 2010-06-23 04:10:53
您将很难直接替换该while循环。SqlDataReader不是线程安全类,因此不能直接从多个线程使用它。
也就是说,您可以使用TPL处理读取的数据。这里有几个选择。最简单的方法可能是创建自己的IEnumerable<T>
实现,它在阅读器上工作,并返回包含数据的类或结构。然后,您可以使用PLINQ或Parallel.ForEach
语句并行处理数据:
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 ...);
}
}
}
}
一旦你有了这个方法,你就可以通过PLINQ或TPL直接处理:
Parallel.ForEach(this.ReadData(), data =>
{
// Use the data here...
});
或者:
this.ReadData().AsParallel().ForAll(data =>
{
// Use the data here...
});
https://stackoverflow.com/questions/3096727
复制相似问题