Sto lavorando a un'applicazione esistente. Questa applicazione legge i dati da un file enorme e quindi, dopo aver eseguito alcuni calcoli, memorizza i dati in un'altra tabella.Ciclo foreach molto lento
Ma il ciclo che esegue questa operazione (vedere di seguito) richiede molto tempo. Poiché il file contiene talvolta 1.000 di record, l'intero processo richiede giorni.
Posso sostituire questo ciclo foreach
con qualcos'altro? Ho provato a utilizzare Parallel.ForEach
e ha aiutato. Sono nuovo a questo, quindi apprezzerò il tuo aiuto.
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)
{
…
}
}
Dopo aver esaminato le risposte, ho rimosso Async e utilizzato modificato il codice come di seguito. Ma questo non ha migliorato le prestazioni.
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()
{
}
}
}
}
}
Due pensieri: in primo luogo, stai sbagliando in modo asincrono e, di conseguenza, stai dormendo per MOLTI articoli nel ciclo. Secondo, puoi riutilizzare l'oggetto SqlCommand per l'intero ciclo invece di crearne/distruggerne ogni volta? – n8wrl
Se ci dici di più su cosa stai cercando di realizzare, potremmo potenzialmente mostrarti una soluzione in SQL che esegue diversi ordini di grandezza più velocemente, ed evita del tutto l'intera azienda asincrona/parallela. –
@ user1110790: il codice che hai postato era pieno di errori (e ne ha ancora almeno uno), quindi l'ho ripulito un po '. Posso umilmente suggerire che quando pubblichi su SO, assicurati che il tuo codice sia OK; altrimenti potresti semplicemente ricevere molti commenti concentrati su questo, anziché sul problema reale. – stakx