« Volver
in asp.net read.

[ASP.NET] Cargando datos en paralelo con Parallel.Invoke.

Hola, hoy quiero mostrarles una forma en la cual podemos realizar tareas en paralelo de una manera muy sencilla, aclaro que no es la única forma, sin embargo me gusta bastante usar Parallel.Invoke por su facilidad de uso, sin embargo debemos tener algunos puntos pendientes:

  • Los métodos que se llaman no pueden recibir parámetros
  • No se garantiza un orden específico en la ejecución de los métodos

Pueden consultar la documentación oficial en MSDN: Parallel.Invoke

Pero veamos un ejemplo, suponemos que tenemos una página en la cual queremos mostrar en un control gridview las personas y en otro grid los productos de una base de datos, si lo miramos tradicionalmente primero se ejecutara un método y después el otro, es decir de manera secuencial, en ese caso vamos a declarar dos métodos que van a cargar los datos en los gridview:

1: privatevoid CargarPersonas()

2: {

3: grvPersonas.DataSource = BDManager.getInstance.ObtenerPersonas();

4: grvPersonas.DataBind();

5: }

6: 

7: privatevoid CargarProductos()

8: {

9: grvProductos.DataSource = BDManager.getInstance.ObtenerProductos();

10: grvProductos.DataBind();

11: }

En ambos métodos, se hace un llamado a la clase BDManager la cual tiene los métodos para conectarnos a la base de datos, el código de dicha clase es:

1: using System;

2: using System.Collections.Generic;

3: using System.Linq;

4: 

5: namespace ParallelInvoke

6: {

7: publicclass BDManager

8: {

9: privatestaticvolatile BDManager _uniqueInstance;

10: privatestaticreadonly Object syncRoot = new Object();

11: 

12: private BDManager() { }

13:

14: publicstatic BDManager getInstance

15: {

16: get

17: {

18: if (_uniqueInstance null)

19: {

20: lock (syncRoot)

21: {

22: if (_uniqueInstance null)

23: _uniqueInstance = new BDManager();

24: }

25: }

26: return _uniqueInstance;

27: }

28: }

29: 

30: public IEnumerable ObtenerPersonas()

31: {

32: using (var context = new AdventureWorks2008R2Entities())

33: {

34: return context.People.ToList();

35: }

36: }

37: 

38: public IEnumerable ObtenerProductos()

39: {

40: using (var context = new AdventureWorks2008R2Entities())

41: {

42: return context.Products.ToList();

43: }

44: }

45: }

46: }

Lo único raro de la clase es que estamos usando un Singleton para crear solo una única instancia de la clase, en el siguiente post lo veremos más en detalle, pero volviendo al tema principal, para cargar los datos de la manera tradicional lo que podemos tener es:

1: privatevoid CargarDatos1()

2: {

3: CargarPersonas();

4: CargarProductos();

5: }

Y como comente antes se ejecutará unos tras el otro, ahora si quisiéramos usar Parallel.Invoke sería:

1: privatevoid CargarDatos2()

2: {

3: Parallel.Invoke(new Action[]{CargarPersonas, CargarProductos});

4: }

Como podemos observar el cambio es bastante sencillo, y finalmente si usamos el IntelliTrace de Visual Studio nos daremos cuenta que el hilo de cada método es diferente:

Imagen1

Espero les sea de utilidad y de interés este post, saludos!

comments powered by Disqus