Estoy trabajando en una aplicación existente. Esta aplicación lee datos de un archivo enorme y luego, después de hacer algunos cálculos, almacena los datos en otra tabla.Bucle foreach muy lento
Pero el ciclo que hace esto (ver a continuación) está tomando mucho tiempo. Dado que el archivo a veces contiene miles de registros, todo el proceso lleva días.
¿Puedo reemplazar este foreach
loop con algo más? Intenté usar Parallel.ForEach
y me ayudó. Soy nuevo en esto, por lo que agradeceré su ayuda.
foreach (record someredord Somereport.r)
{
try
{
using (var command = new SqlCommand("[procname]", sqlConn))
{
command.CommandTimeout = 0;
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(…);
IAsyncResult result = command.BeginExecuteReader();
while (!result.IsCompleted)
{
System.Threading.Thread.Sleep(10);
}
command.EndExecuteReader(result);
}
}
catch (Exception e)
{
…
}
}
Después de revisar las respuestas, eliminé el asíncrono y usados editar el código de la siguiente manera. Pero esto no mejoró el rendimiento.
using (command = new SqlCommand("[sp]", sqlConn))
{
command.CommandTimeout = 0;
command.CommandType = CommandType.StoredProcedure;
foreach (record someRecord in someReport.)
{
command.Parameters.Clear();
command.Parameters.Add(....)
command.Prepare();
using (dr = command.ExecuteReader())
{
while (dr.Read())
{
if()
{
}
else if()
{
}
}
}
}
}
Dos pensamientos: primero, está haciendo una asincronización incorrecta y, como resultado, es probable que esté durmiendo durante MUCHOS elementos en el ciclo. En segundo lugar, ¿puede reutilizar el objeto SqlCommand para todo el ciclo en lugar de crear/destruir uno cada vez? – n8wrl
Si nos dice más acerca de qué es lo que está tratando de lograr, podríamos potencialmente mostrarle una solución en SQL que corre varios órdenes de magnitud más rápido, y evita todo este negocio asincrónico/paralelo por completo. –
@ user1110790: El código que publicó estaba lleno de errores (y todavía tiene al menos uno), así que lo he limpiado un poco. Puedo sugerir humildemente que cuando publiques en SO, asegúrate de que tu código sea correcto; de lo contrario, es posible que obtenga muchos comentarios enfocados en eso, en lugar de en el tema real. – stakx