如何改进插入列表,使用多核

时间:2012-07-02 10:54:17

标签: c# list parallel-processing

我必须从数据库中读取100.000行,我使用此代码:

List<elementClass> Listelement = new List<elementClass>();
using (DbDataReader reader = cmd.ExecuteReader())
{
    while (reader .Read())
    {
        elementClass element= new elementClass();
        DatabaseClass.ReadFromObject(reader , element);
        Listelement.Add(element);
    }
}

ReadFromObject:

public static void ReadFromObject(DbDataReader dr, Object obj)
{
    DataTable tableDescriptor = dr.GetSchemaTable();

    try
    {
        //Id - Identifier
        obj.GetType().GetProperty("Id").SetValue(obj, dr.GetValue(dr.GetOrdinal("Id")), null);

        PropertyInfo[] properties = obj.GetType().GetProperties();
        foreach (PropertyInfo pi in properties)
        {
            if (!ExistColumn(tableDescriptor, pi.Name)) continue;   // field not found
            if (dr[pi.Name] == DBNull.Value) continue;

            if (pi.PropertyType.IsEnum) { }
            else
            {
                switch (pi.PropertyType.Name)
                {
                    case "DateTime":
                        object dateValue = null;
                        if (dr[pi.Name].GetType().Name == "String")
                            dateValue = F24Common.Utility.DateFromString(dr.GetString(dr.GetOrdinal(pi.Name)));
                        else
                            dateValue = dr.GetDateTime(dr.GetOrdinal(pi.Name));
                        pi.SetValue(obj, dateValue, null);
                        break;
                    default:
                         pi.SetValue(obj, dr.GetValue(dr.GetOrdinal(pi.Name)), null);
                        break;
                }
            }
        }

    }
    catch (Exception )
    {

    }
}

这段代码肯定有问题,它太慢了(整个处理需要45-50分钟)。 是否可以同时使用多个CPU内核(我有一个四核CPU)来填充列表?

1 个答案:

答案 0 :(得分:1)

乍一看,我认为瓶颈在于反射量。我建议你好好阅读Jon Skeets Making Reflection fly article。然后,您可以缓存键入obj类型的相应代理。

我会犹豫从多个线程访问DataReader,因为我怀疑这样做是安全的。