C# 并行SqlDataReader和并行reader.Read()

C# 并行SqlDataReader和并行reader.Read(),c#,sql,multithreading,parallel-processing,sqldatareader,C#,Sql,Multithreading,Parallel Processing,Sqldatareader,我想在并行模式下进行查询,或者哪种方式对SQL进行查询更好 咨询花费3分钟从7只股票中进行7次循环,但我需要花费更少的时间,也许可以同时进行7次咨询并返回结果 我对代码的问题是读者。阅读咨询之间的maybie休克 List<List<clsExistenciaA>> ListaExistencia = new List<List<clsExistenciaA>>(); SqlConnection objConexion = new SqlConne

我想在并行模式下进行查询,或者哪种方式对SQL进行查询更好

咨询花费3分钟从7只股票中进行7次循环,但我需要花费更少的时间,也许可以同时进行7次咨询并返回结果

我对代码的问题是读者。阅读咨询之间的maybie休克

List<List<clsExistenciaA>> ListaExistencia = new List<List<clsExistenciaA>>();
SqlConnection objConexion = new SqlConnection();//conexion a sql
try
{
    objConexion.ConnectionString = @"Database=DataDB;Data Source=local;User Id=sa;Password=20011$;MultipleActiveResultSets=True";
    objConexion.Open();
}
catch { MessageBox.Show("No se puede conectar al servidor"); }

try
{
    string almacen;
    int i = 0;
    foreach(clsExistenciaA A in AlmaceneS)
    {
         //Parallel.ForEach(AlmaceneS, clsExistenciaA =>
         //{
         //    lock (AlmaceneS)
         //    {
         //        almacen = clsExistenciaA.CodigoAlm;
         almacen = A.CodigoAlm;

         SqlCommand comm = new SqlCommand();//crea command
         comm.Connection = objConexion;// se agrega la conexion al comando
         comm.CommandType = CommandType.Text;// se define el tipo de comando
         string sql = "";

         sql = "select c_codigo_alm, v_nombre_alm from invalmacen (nolock) where c_pedido_alm='almacen'";
         comm.CommandTimeout = 1000;
         comm.CommandText = sql;// se agrega la consulta a el comando
         SqlDataReader reader = comm.ExecuteReader();// se ejecuta el comando en un data reader

         ListaExistencia.Add(new List<clsExistenciaA>());
         string piezaN = "0";
         string kiloN = "0";

         while(reader.Read())
         {
             if (reader["pieza"].ToString() != "")
             {
                piezaN = reader["pieza"].ToString();
             }
             if (reader["kilos"].ToString() != "")
             {
                 kiloN = reader["kilos"].ToString();
             }

             ListaExistencia[i].Add(new clsExistenciaA()
             {
                 pro = reader["pro"].ToString(),
                 nompro = reader["v_nombre_pro"].ToString(),
                 pieza = Math.Round(double.Parse(piezaN), 2),
                 kilos = Math.Round(double.Parse(kiloN), 2),
                 CodigoAlm = almacen,
              }); // se agregan los datos a un Ilist

          }

          reader.Close();

     }
     ////}
     //});
    return ListaExistencia;
}
catch (Exception ex) {...}
编辑:我试过用新的conextion,但还是一样的3分钟。 现在,我试着使用线程,结果是一样的


我曾尝试优化查询,但我无法

你是说当你使用Paralel.ForEach时,它不起作用吗?如果是,您遇到了什么错误/问题?作为猜测,我认为您需要在Parallel.ForEach内部创建连接,以确保两个线程不会同时使用单个连接。sql不是有效的sql,没有from子句,您使用的是不带group by的sum。如果使用普通ForEach,则时间为3分钟,每次7次查询*30秒,而对于Paralel.ForEach,在列表中不显示正确的结果可能是因为与whilereader.Read及其变量发生冲突。使用lock AlmaceneS只能正常运行,但要花同样的3分钟,所以这不是提高性能的解决方案。@Scott Chamberlain我剪切了SQL,因为它太大了。你试过你的代码,看看它在哪里花了3分钟吗?这是你的电话号码