Utilizando C#/.NET 3.5.SqlDataAdapter.Fill - Aproximación asincrónica
Actualmente estoy poblando 2 DataTables uno después de otro utilizando SqlDataAdapter.Fill().
Quiero llenar ambos DataTables en paralelo, al mismo tiempo haciendo cada uno de forma asincrónica. Sin embargo, no hay una versión asíncrona del método Fill(), es decir, BeginFill() sería genial.
Un enfoque que he probado es (pseudo):
- SqlCommand1.BeginExecuteReader // primera consulta, por DataTable1
- SqlCommand2.BeginExecuteReader // segunda consulta, para DataTable2
- SqlCommand1.EndExecuteReader
- SqlCommand2.EndExecuteReader
- DataTable1.Load (DataReader1)
- DataTable2.Load (DataReader2)
Sin embargo, DataTable.Load() toma mucho tiempo:
Se tarda de 3 segundos para hacer el paso 1 al paso 4.
Paso 5 entonces toma 22 segundos.
El paso 6 lleva 17 segundos.
Por lo tanto, combinados 39 segundos para los pasos 5 y 6.
El resultado final es que esto no me da ningún beneficio sobre solo hacer 2 SqlDataAdapter.Fills, uno después del otro. Quiero que el resultado neto sea que todo el proceso toma solo el tiempo que la consulta más larga (o lo más cerca posible).
En busca de formas recomendadas para terminar con algo que es realmente un enfoque asincrónico para llenar un DataTable.
¿O simplemente lo administro yo mismo y enrollo 2 hilos separados, cada uno llenando un DataTable?
Así que una vez que he hizo cola cada uno, ¿cómo puedo esperar hasta tanto ¿Han completado? Necesito que se llenen ambas tablas antes de continuar y procesarlas – AdaTheDev
Agregué el concepto de espera a mi respuesta, si eso ayuda. –
@AdaTheDev, utilizaría AutoResetEvents que se activaría una vez que el trabajo se haya completado (dentro de cada subproceso independiente). Vea la respuesta de @Neil como ya ha proporcionado un ejemplo. – James