ProgramacioŐĀn AsiŐĀncrona | Trabajando con Delegados Asincronos C#

Se ha venido hablando mucho en los √ļltimos a√Īos sobre la programaci√≥n As√≠ncrona, ya que este esquema de programaci√≥n puede mejorar mucho nuestros programas claro est√° si lo aplicamos correctamente.

En ocasiones nuestros programas nos dan la notificaci√≥n de que el programa no responde o se congela ¬†cuando el usuario interact√ļa con ellos. Esto ocurre porque hay algunas tareas pesadas que se est√°n ejecutando detr√°s, y como s√≥lo hay un hilo de ejecuci√≥n, ¬†entonces no le queda otra opci√≥n ¬†que esperar a que termine dicha tarea para estar nuevamente disponible. Mejorar este tipo de comportamientos les da un toque de profesionalidad a nuestro trabajo algo¬†¬†que siempre es importante.

En esta entrada veremos cómo aplicar la programación asíncrona usando delegados asíncronos, en otra ocasión hace tiempo escribí una entra sobre los delegados la puede leer en el siguiente enlace aquí y otro aquí.

Si con los enlaces no basta para comprender, a continuaci√≥n haremos un peque√Īo ejemplo de c√≥mo funcionan los delegados.

¬ŅQu√© es un Delegado?

Un delegado es la implementación de .NET de los punteros a funciones.

Ahora vamos al ejemplo “suuuuper” sencillo de un delegado.

Primero declaramos un delegado:

  delegate int delegadoProducto(int a, int b);

A continuación creamos una función con la misma estructura del delegado:

public class DelegadoProducto
    {
        public int Producto(int x, int y)
        {
            Console.WriteLine();
            Console.WriteLine("DelegadoProducto.Producto: Calculando el producto de {0} por {1}", x.ToString(), y.ToString());
            Console.WriteLine();
            return x * y;
        }
    }

Ahora instanciamos un objeto de nuestro delegado:

  public static void Main(string[] args)
        {
            // Instanciamos un delegado
            var objDelegado = new DelegadoProducto();
 
            // Asignamos el objeto recién creado a la función que creamos en la clase de apoyo
            delegadoProducto variableDelegadoProducto = new delegadoProducto(objDelegado.Producto);
 
            // Llamamos a la función a través del delegado
            var resultado = variableDelegadoProducto(4, 4);
 
            // Imprimimos el resultado de la ejecución
            Console.WriteLine("Resultado del producto es: {0}", resultado.ToString());
            Console.ReadLine();
        }

Si se fijan Sólo se puede asignar funciones a objetos que tienen la misma estructura que su delegado.

Esta es la salida de nuestro programa en consola en mi caso terminal puesto que estoy usando Mac OS.

Aplicando la programación Asíncrona a nuestros delegados.

Vamos con un ejemplo un poco más elaborado para entender mejor el concepto de llamada síncrona.

Para este ejemplo voy a usar a dos de mis amigas  Naiomi y Maria. Ellas harán un viaje hacia la ciudad de NEW YORK que demora 15 segundos aproximadamente. ( es solo un ejemplo)

El codigo el siguiente:

sing System;
using System.Diagnostics;
 
namespace ProgramacionAsincrona.Delegados
{
    class Program
    {
        delegate int DelegadoViajeNYC(string NombreViajero, Stopwatch temporizador);
 
        static void Main(string[] args)
        {
            // Se instancia un temporizador para calcular el tiempo de ejecución.
            var temporizador = Stopwatch.StartNew();
            
            // Se instancia la clase de apoyo
            var objViaje = new Viaje();
 
            // Se crea el primer delegado, que representará el primer viaje.
            DelegadoViajeNYC viajeNaiomi = new DelegadoViajeNYC(objViaje.ViajeNYC);
 
            // Se crea el segundo delegado, que representará el segundo viaje.
            DelegadoViajeNYC viajeMaria = new DelegadoViajeNYC(objViaje.ViajeNYC);
 
            // Ahora ejecutamos los delegados que harán los viajes
            viajeNaiomi("Naiomi", temporizador);
            viajeMaria("Maria", temporizador);
 
            // Hacemos una pequeña pausa y luego mostramos el mensaje de fin de viajes
            System.Threading.Thread.Sleep(1500);
            Console.WriteLine();
            Console.WriteLine("=> Finalizó las llamadas a los viajes, a los {0} segundos.", temporizador.Elapsed.TotalSeconds.ToString());
            Console.WriteLine();
 
            Console.ReadLine();
        }
    }
 
    public class Viaje
    {
        public int ViajeNYC(string NombreViajera, Stopwatch temporizador)
        {
            Console.WriteLine();
            Console.WriteLine("Inicio de viaje realizado por {0}.", NombreViajera);
            System.Threading.Thread.Sleep(15000);
            Console.WriteLine("Fin de viaje realizado por {0}, a los {1} segundos.", NombreViajera, temporizador.Elapsed.TotalSeconds.ToString());
            return 0;
        }
    }
 
}

Recapitulando

Si eres observador puedes notar que la ejecución del programa es lineal: se llama al primer viaje, cuando éste termina se llama al segundo viaje y cuando éste segundo termina se muestra el mensaje de fin de llamadas de viajes. Esto sucede porque estamos llamando a los delegados de forma síncrona, que es casi lo mismo que llamar directamente a la función. El tiempo total de ejecución de todo el programa es un poco más de 31 segundos.

Realizando llamada asíncrona a un delegado

Cambiamos las líneas 24 y 25 por llamadas asíncronas a los delegados.

            // Ahora ejecutamos los delegados que harán los viajes  (llamadas asíncronas)
            viajeNaiomi.BeginInvoke("Naiomi", temporizador, null, null);
            viajeMaria.BeginInvoke("Maria", temporizador, null, null);

Si ejecutamos nuestro codigo el resultado seria el siguiente:

El programa principal hace las llamadas (asíncronas) a los delegados y sigue su ejecución sin esperar a que estas llamadas terminen. Internamente la ejecución de dichas llamadas sucede en un hilo diferente al hilo del programa principal. Este manejo de hilos es interno, de forma transparente para nosotros.

Conclusiones

Ya puedes imaginar el potencial de esta técnica, cómo implementar este tipo de llamadas para algunos procesos que demanden muchos recursos y poder reducir los tiempos de ejecución dividiendo las tareas a través de llamadas asíncronas. Espero que la apliquen en sus próximos desarrollos.

 

 

 

 

Xamarin y otras especias | Charla

Saludos mi buen amigo¬†Cristopher Junior Vivieca Ramos¬†de ¬†viviecar.com¬†me invito a dar una charla en el Instituto Polit√©cnico Padre Segri en Santiago, Rep. Dominicana. donde estuve hablando sobre “Xamarin y otras especias”

Fotos del evento.

Presentación del evento.

Te gustaria que sea ponente en alguna charla ?

Si te gustaria que diera una charla sobre el mismo tema o otras tecnologías Microsoft no dudes en ponerte en contacto conmigo.

Xamarin Diplomado Latinoamérica 3.0

Xamarin Diplomado Latinoamérica 3.0

Microsoft México se anunció una nueva versión del #XamarinDiplomado: Xamarin Diplomado Latinoamérica 3.0, el cual abarcará desde los temas básicos (instalación de herramientas) hasta temas más avanzados, con nuevos speakers y sorpresas.

De momento no se ha dado m√°s informaci√≥n sobre la fecha de inicio y los temas espec√≠ficos del diplomado, pero ya te puedes registrar, dando clic en el siguiente enlace: —>¬†diplomadoxamarin

Xamarin Diplomado es gratis !

Recuerda que el diplomado es gratuito y que aprender√°s muchas cosas nuevas sobre Xamarin, una herramienta que te permite desarrollar aplicaciones m√≥viles multiplataforma que se pueden ejecutar en Android, iOS y Windows 10. Si ya tomaste los diplomados anteriores, contin√ļa con tu formaci√≥n en esta nueva versi√≥n del curso; y si no has comenzado con Xamarin pero te interesa aprender, pues esta es una excelente oportunidad para hacerlo, dado que el curso comenzar√° desde lo b√°sico. Y en espa√Īol.

Encryption Simetrica

Esta entrada esta realizada por Yhorby, Manuel, Mario, Ysael y Frank. Para la clase de seguridad informatica del profesor Juan Jose Diaz Nerio, de la universidad UTESA.

El objetivo es entender como funciona el cifrado simetrico, para este tutorial nosotros utilizamos http://www.izarc.org/downloads , pueden descargalo desde ese enlace.

A continuación describiremos el ambiente:

  • Windows 10
  • Windows server 2012¬†
  • IZArc
  • Bloc de notas

A continuación explicaremos el proceso de instalación y uso:

Luego de descargado ejecutamos el instalador:

n1

Aceptamos los términos

n2

Esperemos que se instale 

n3

Seleccionamos la extensiones de archivo a manejar

n4

Este es el icono que encontraremos en el escritorio

n5

Acá esta el vídeo donde explicamos paso por paso como usarlo, alguna duda comentario o sugerencia dejarla en los comentarios:

 

 

 

 

Codigo fuente de la App Demo #Charla gratuita de Conceptos Fundamentales de #Xamarin en #MundoSQL

Mi buen amigo el MVP Juan Carlos de  MundoSQL me invito a dar una charla online sobre Xamarin,  aqui les dejo el codigo fuente de la demo.

El codigo de main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listView1" />
</LinearLayout>

El codigo del MainActivity.cs

using Android.App;
using Android.Widget;
using Android.OS;
using System.Collections.Generic;

namespace dfdd
{
	[Activity(Label = "Lista", MainLauncher = true, Icon = "@mipmap/icon")]
	public class MainActivity : Activity
	{
		private List<string> mItem;
		private ListView mListView;

		protected override void OnCreate(Bundle savedInstanceState)
		{
			base.OnCreate(savedInstanceState);

			// Set our view from the "main" layout resource
			SetContentView(Resource.Layout.Main);

			mListView = FindViewById<ListView>(Resource.Id.listView1);

			mItem = new List<string>();
			mItem.Add("Naiomi");
			mItem.Add("Jose Miguel");
			mItem.Add("Juan carlos");
			mItem.Add("Luis");
			mItem.Add("Frank ac");
			mItem.Add("JLuis Perez");
			mItem.Add("Jordi");
			mItem.Add("Jose Miguel");
			mItem.Add("Naiomi");
			mItem.Add("Jose Miguel");
			mItem.Add("Juan carlos");
			mItem.Add("Luis");
			mItem.Add("Frank ac");
			mItem.Add("JLuis Perez");
			mItem.Add("Jordi");
			mItem.Add("Jose Miguel");
			ArrayAdapter<string> adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, mItem);

			mListView.Adapter = adapter;

		
  }
	}
}


Aqui el video de la demo !

Esto es todo por el momento alguna duda, comentario o sugerencia no duden en escribirme.

Errores en Xamarin “Unzipping failed”

En mis inicios con Xamarin, utilice por primera vez Xamarin.Droid y durante la compilación del proyecto recibí errores que casi hacen que tire la toalla, similares a estos :

Error      2             Unzipping failed. Please download https://dl-ssl.google.com/android/repository/android_m2repository_r22.zip and extract it to the C:\Users\User\AppData\Local\Xamarin\Xamarin.Android.Support.Design\23.0.1.3\content directory.                DemoForms.Droid

Error      3             Reason: C:\Users\User\AppData\Local\Xamarin\zips\96659D653BDE0FAEDB818170891F2BB0.zip is not a valid zip file            DemoForms.Droid

 

 Porque sucede esto ?

Cuando compilamos por primera vez nuestro proyecto se descargan de algunas librer√≠as propias de Android, estas librer√≠as se descargan en ficheros ¬†.zip y luego estos ¬†son descomprimidas durante el proceso de compilaci√≥n. Estas librer√≠as se almacenan en el directorio “%LOCALAPPDATA%\Xamarin\zips”.

Todos sabemos¬†Visual Studio no es muy expl√≠cito acerca de lo que est√° haciendo mientras compila y dependiendo de la velocidad ¬†nuestra conexi√≥n a Internet ¬†este proceso puede ser muy lento, esto provoca que en muchas ocasiones esta lentitud causa que cancelemos el proceso de compilacion pensando en que Visual Studio ya no est√° haciendo nada, sin embargo, lo que logramos es que las descargas queden a medias y esos archivos se mantienen da√Īados en el¬†directorio “%LOCALAPPDATA%\Xamarin\zips”.

Solución !

Eliminar de manera manual los archivos da√Īados en el¬†directorio “%LOCALAPPDATA%\Xamarin\zips”.¬†y re-compilar la soluci√≥n ahora si con paciencia esperando a que se descargue todo.